diff options
92 files changed, 887 insertions, 1712 deletions
diff --git a/.gitattributes b/.gitattributes index 30cc9de8f1..5c7f5b73b0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,8 +1,5 @@  * text eol=lf -# VSTool (normalization disabled) -indra/tools/vstool/* -text -  # Images  *.bmp binary  *.BMP binary diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 4bf2af644a..e4da631dc6 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -42,7 +42,7 @@ jobs:      needs: setup      strategy:        matrix: -        runner: ${{ fromJson((github.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/Second_Life')) && '["windows-large","macos-15-xlarge"]' || '["windows-latest","macos-15"]') }} +        runner: ${{ fromJson((github.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/Second_Life')) && '["windows-large","macos-15-xlarge"]' || '["windows-2022","macos-15"]') }}          configuration: ${{ fromJson(needs.setup.outputs.configurations) }}      runs-on: ${{ matrix.runner }}      outputs: @@ -306,7 +306,7 @@ jobs:        AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}        AZURE_TENANT_ID:     ${{ secrets.AZURE_TENANT_ID }}      needs: build -    runs-on: windows-latest +    runs-on: windows-2022      steps:        - name: Sign and package Windows viewer          if: env.AZURE_KEY_VAULT_URI && env.AZURE_CERT_NAME && env.AZURE_CLIENT_ID && env.AZURE_CLIENT_SECRET && env.AZURE_TENANT_ID diff --git a/.github/workflows/qatest.yaml b/.github/workflows/qatest.yaml index 4e10900441..b6883d88d4 100644 --- a/.github/workflows/qatest.yaml +++ b/.github/workflows/qatest.yaml @@ -43,13 +43,25 @@ jobs:              artifact: Windows-installer              install-path: 'C:\viewer-automation-main'            - os: windows -            runner: qa-dan-asus +            runner: qa-windows-asus-dan +            artifact: Windows-installer +            install-path: 'C:\viewer-automation-main' +          - os: windows +            runner: qa-windows-kurt              artifact: Windows-installer              install-path: 'C:\viewer-automation-main'            - os: mac +            runner: qa-mac-dan +            artifact: macOS-installer +            install-path: '$HOME/Documents/viewer-automation' +          - os: mac              runner: qa-mac-atlas              artifact: macOS-installer              install-path: '$HOME/Documents/viewer-automation' +          - os: mac +            runner: qa-mac-caleb +            artifact: macOS-installer +            install-path: '$HOME/Documents/viewer-automation'        fail-fast: false      runs-on: [self-hosted, "${{ matrix.runner }}"] diff --git a/autobuild.xml b/autobuild.xml index 349f6e34a3..5151b8cf65 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1445,11 +1445,11 @@                <key>creds</key>                <string>github</string>                <key>hash</key> -              <string>9e59c93c7110e87b4ff3db330f11a23c50e5000f</string> +              <string>7facda95e2f00c260513f3d4db42588fa8ba703c</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/178910560</string> +              <string>https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/196289774</string>              </map>              <key>name</key>              <string>darwin64</string> @@ -1461,11 +1461,11 @@                <key>creds</key>                <string>github</string>                <key>hash</key> -              <string>7ed994db5bafa9a7ad09a1b53da850a84715c65e</string> +              <string>01d08f13c7bc8d1b95b0330fa6833b7d8274e4d0</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/178910561</string> +              <string>https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/196289775</string>              </map>              <key>name</key>              <string>linux64</string> @@ -1477,24 +1477,24 @@                <key>creds</key>                <string>github</string>                <key>hash</key> -              <string>66824c02e0e5eabbfbe37bfb173360195f89697c</string> +              <string>6d00345c7d3471bc5f7c1218e014dd0f1a2c069b</string>                <key>hash_algorithm</key>                <string>sha1</string>                <key>url</key> -              <string>https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/178910562</string> +              <string>https://api.github.com/repos/secondlife/llphysicsextensions_source/releases/assets/196289778</string>              </map>              <key>name</key>              <string>windows64</string>            </map>          </map> +        <key>copyright</key> +        <string>Copyright (c) 2010, Linden Research, Inc.</string>          <key>license</key>          <string>internal</string>          <key>license_file</key>          <string>LICENSES/llphysicsextensions.txt</string> -        <key>copyright</key> -        <string>Copyright (c) 2010, Linden Research, Inc.</string>          <key>version</key> -        <string>1.0.66e6919</string> +        <string>1.0.11137145495</string>          <key>name</key>          <string>llphysicsextensions_source</string>        </map> diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt deleted file mode 100644 index 8b13789179..0000000000 --- a/indra/edit-me-to-trigger-new-build.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp index 56c0a97635..bde1aed910 100644 --- a/indra/llcorehttp/_httpoprequest.cpp +++ b/indra/llcorehttp/_httpoprequest.cpp @@ -540,6 +540,7 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)      long sslHostV(0L);      long dnsCacheTimeout(-1L);      long nobody(0L); +    curl_off_t lastModified(0L);      if (mReqOptions)      { @@ -548,6 +549,7 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)          sslHostV = mReqOptions->getSSLVerifyHost() ? 2L : 0L;          dnsCacheTimeout = mReqOptions->getDNSCacheTimeout();          nobody = mReqOptions->getHeadersOnly() ? 1L : 0L; +        lastModified = (curl_off_t)mReqOptions->getLastModified();      }      check_curl_easy_setopt(mCurlHandle, CURLOPT_FOLLOWLOCATION, follow_redirect); @@ -556,6 +558,17 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service)      check_curl_easy_setopt(mCurlHandle, CURLOPT_NOBODY, nobody); +    if (lastModified) +    { +        check_curl_easy_setopt(mCurlHandle, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE); +#if (LIBCURL_VERSION_NUM >= 0x073B00) +        // requires curl 7.59.0 +        check_curl_easy_setopt(mCurlHandle, CURLOPT_TIMEVALUE_LARGE, lastModified); +#else +        check_curl_easy_setopt(mCurlHandle, CURLOPT_TIMEVALUE, (long)lastModified); +#endif +    } +      // The Linksys WRT54G V5 router has an issue with frequent      // DNS lookups from LAN machines.  If they happen too often,      // like for every HTTP request, the router gets annoyed after diff --git a/indra/llcorehttp/httpoptions.cpp b/indra/llcorehttp/httpoptions.cpp index d85f6039b1..5abd28e211 100644 --- a/indra/llcorehttp/httpoptions.cpp +++ b/indra/llcorehttp/httpoptions.cpp @@ -47,6 +47,7 @@ HttpOptions::HttpOptions() :      mVerifyPeer(sDefaultVerifyPeer),      mVerifyHost(false),      mDNSCacheTimeout(-1L), +    mLastModified(0),      mNoBody(false)  {} @@ -129,6 +130,11 @@ void HttpOptions::setHeadersOnly(bool nobody)      }  } +void HttpOptions::setLastModified(time_t lastModified) +{ +    mLastModified = lastModified; +} +  void HttpOptions::setDefaultSSLVerifyPeer(bool verify)  {      sDefaultVerifyPeer = verify; diff --git a/indra/llcorehttp/httpoptions.h b/indra/llcorehttp/httpoptions.h index 56a28013cb..fdb277c66e 100644 --- a/indra/llcorehttp/httpoptions.h +++ b/indra/llcorehttp/httpoptions.h @@ -178,6 +178,13 @@ public:          return mNoBody;      } +    // Default:   0 +    void setLastModified(time_t lastModified); +    time_t getLastModified() const +    { +        return mLastModified; +    } +      /// Sets default behavior for verifying that the name in the      /// security certificate matches the name of the host contacted.      /// Defaults false if not set, but should be set according to @@ -199,6 +206,7 @@ protected:      bool                mVerifyHost;      int                 mDNSCacheTimeout;      bool                mNoBody; +    time_t              mLastModified;      static bool         sDefaultVerifyPeer;  }; // end class HttpOptions diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp index 6a663a8e97..563dd9459c 100644 --- a/indra/llmessage/llcoproceduremanager.cpp +++ b/indra/llmessage/llcoproceduremanager.cpp @@ -50,7 +50,7 @@ static const U32 DEFAULT_POOL_SIZE = 5;  // SL-14399: When we teleport to a brand-new simulator, the coprocedure queue  // gets absolutely slammed with fetch requests. Make this queue effectively  // unlimited. -const U32 LLCoprocedureManager::DEFAULT_QUEUE_SIZE = 1024*1024; +const U32 LLCoprocedureManager::DEFAULT_QUEUE_SIZE = 1024*512;  //=========================================================================  class LLCoprocedurePool: private boost::noncopyable @@ -58,7 +58,7 @@ class LLCoprocedurePool: private boost::noncopyable  public:      typedef LLCoprocedureManager::CoProcedure_t CoProcedure_t; -    LLCoprocedurePool(const std::string &name, size_t size); +    LLCoprocedurePool(const std::string &name, size_t size, size_t queue_size);      ~LLCoprocedurePool();      /// Places the coprocedure on the queue for processing. @@ -118,7 +118,7 @@ private:      typedef std::shared_ptr<CoprocQueue_t> CoprocQueuePtr;      std::string     mPoolName; -    size_t          mPoolSize, mActiveCoprocsCount, mPending; +    size_t          mPoolSize, mQueueSize, mActiveCoprocsCount, mPending;      CoprocQueuePtr  mPendingCoprocs;      LLTempBoundListener mStatusListener; @@ -141,7 +141,7 @@ LLCoprocedureManager::~LLCoprocedureManager()      close();  } -void LLCoprocedureManager::initializePool(const std::string &poolName) +void LLCoprocedureManager::initializePool(const std::string &poolName, size_t queue_size)  {      poolMap_t::iterator it = mPoolMap.find(poolName); @@ -180,7 +180,7 @@ void LLCoprocedureManager::initializePool(const std::string &poolName)          LL_WARNS("CoProcMgr") << "LLCoprocedureManager: No setting for \"" << keyName << "\" setting pool size to default of " << size << LL_ENDL;      } -    poolPtr_t pool(new LLCoprocedurePool(poolName, size)); +    poolPtr_t pool(new LLCoprocedurePool(poolName, size, queue_size));      LL_ERRS_IF(!pool, "CoprocedureManager") << "Unable to create pool named \"" << poolName << "\" FATAL!" << LL_ENDL;      bool inserted = mPoolMap.emplace(poolName, pool).second; @@ -212,7 +212,8 @@ void LLCoprocedureManager::setPropertyMethods(SettingQuery_t queryfn, SettingUpd      mPropertyQueryFn = queryfn;      mPropertyDefineFn = updatefn; -    initializePool("Upload"); +    constexpr size_t UPLOAD_QUEUE_SIZE = 2048; +    initializePool("Upload", UPLOAD_QUEUE_SIZE);      initializePool("AIS"); // it might be better to have some kind of on-demand initialization for AIS      // "ExpCache" pool gets initialized in LLExperienceCache      // asset storage pool gets initialized in LLViewerAssetStorage @@ -296,17 +297,19 @@ void LLCoprocedureManager::close(const std::string &pool)  }  //========================================================================= -LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size): +LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size, size_t queue_size):      mPoolName(poolName),      mPoolSize(size), +    mQueueSize(queue_size),      mActiveCoprocsCount(0),      mPending(0),      mHTTPPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID),      mCoroMapping()  { +    llassert_always(mQueueSize > mPoolSize); // queue should be able to fit pool      try      { -        mPendingCoprocs = std::make_shared<CoprocQueue_t>(LLCoprocedureManager::DEFAULT_QUEUE_SIZE); +        mPendingCoprocs = std::make_shared<CoprocQueue_t>(mQueueSize);          // store in our LLTempBoundListener so that when the LLCoprocedurePool is          // destroyed, we implicitly disconnect from this LLEventPump          // Monitores application status @@ -357,7 +360,7 @@ LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size):          mCoroMapping.insert(CoroAdapterMap_t::value_type(pooledCoro, httpAdapter));      } -    LL_INFOS("CoProcMgr") << "Created coprocedure pool named \"" << mPoolName << "\" with " << size << " items, queue max " << LLCoprocedureManager::DEFAULT_QUEUE_SIZE << LL_ENDL; +    LL_INFOS("CoProcMgr") << "Created coprocedure pool named \"" << mPoolName << "\" with " << size << " items, queue max " << mQueueSize << LL_ENDL;  }  LLCoprocedurePool::~LLCoprocedurePool() @@ -376,7 +379,7 @@ LLUUID LLCoprocedurePool::enqueueCoprocedure(const std::string &name, LLCoproced                                     << "\" at "                                << mPending << LL_ENDL; -        if (mPending >= (LLCoprocedureManager::DEFAULT_QUEUE_SIZE - 1)) +        if (mPending >= (mQueueSize - 1))          {              // If it's all used up (not supposed to happen,              // fetched should cap it), we are going to crash diff --git a/indra/llmessage/llcoproceduremanager.h b/indra/llmessage/llcoproceduremanager.h index 6c6e506654..485333657c 100644 --- a/indra/llmessage/llcoproceduremanager.h +++ b/indra/llmessage/llcoproceduremanager.h @@ -79,7 +79,7 @@ public:      void close();      void close(const std::string &pool); -    void initializePool(const std::string &poolName); +    void initializePool(const std::string &poolName, size_t queue_size = DEFAULT_QUEUE_SIZE);  private: diff --git a/indra/llmessage/llexperiencecache.cpp b/indra/llmessage/llexperiencecache.cpp index 83a070df32..78cca47456 100644 --- a/indra/llmessage/llexperiencecache.cpp +++ b/indra/llmessage/llexperiencecache.cpp @@ -110,7 +110,8 @@ void LLExperienceCache::initSingleton()          cache_stream >> (*this);      } -    LLCoprocedureManager::instance().initializePool("ExpCache"); +    constexpr size_t CORO_QUEUE_SIZE = 2048; +    LLCoprocedureManager::instance().initializePool("ExpCache", CORO_QUEUE_SIZE);      LLCoros::instance().launch("LLExperienceCache::idleCoro",          boost::bind(&LLExperienceCache::idleCoro, this)); diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index e898e03feb..173b2b1745 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -592,24 +592,6 @@ U32 LLRenderTarget::getNumTextures() const  void LLRenderTarget::bindTexture(U32 index, S32 channel, LLTexUnit::eTextureFilterOptions filter_options)  {      gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index), filter_options == LLTexUnit::TFO_TRILINEAR || filter_options == LLTexUnit::TFO_ANISOTROPIC); - -    bool isSRGB = false; -    llassert(mInternalFormat.size() > index); -    switch (mInternalFormat[index]) -    { -        case GL_SRGB: -        case GL_SRGB8: -#if GL_VERSION_2_1 -        case GL_SRGB_ALPHA: -#endif -        case GL_SRGB8_ALPHA8: -            isSRGB = true; -            break; - -        default: -            break; -    } -      gGL.getTexUnit(channel)->setTextureFilteringOption(filter_options);      LOG_GLERROR(mName + " bindTexture()"); diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 81d45bc431..7bd8abc592 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -989,16 +989,17 @@ bool LLShaderMgr::validateProgramObject(GLuint obj)      return success;  } -void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version, const LLUUID& current_cache_version) +void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version, const LLUUID& current_cache_version, bool second_instance)  { -    LL_INFOS() << "Initializing shader cache" << LL_ENDL; +    LL_PROFILE_ZONE_SCOPED; +    LL_INFOS("ShaderMgr") << "Initializing shader cache" << LL_ENDL;      mShaderCacheEnabled = gGLManager.mGLVersion >= 4.09 && enabled; -    if(!mShaderCacheEnabled || mShaderCacheInitialized) +    if(!mShaderCacheEnabled || mShaderCacheVersion.notNull())          return; -    mShaderCacheInitialized = true; +    mShaderCacheVersion = current_cache_version;      mShaderCacheDir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "shader_cache");      LLFile::mkdir(mShaderCacheDir); @@ -1007,16 +1008,19 @@ void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version,          std::string meta_out_path = gDirUtilp->add(mShaderCacheDir, "shaderdata.llsd");          if (gDirUtilp->fileExists(meta_out_path))          { -            LL_INFOS() << "Loading shader cache metadata" << LL_ENDL; +            LL_PROFILE_ZONE_NAMED("shader_cache"); +            LL_INFOS("ShaderMgr") << "Loading shader cache metadata" << LL_ENDL; -            llifstream instream(meta_out_path); +            llifstream instream(meta_out_path, std::ifstream::in | std::ifstream::binary);              LLSD in_data; -            LLSDSerialize::fromNotation(in_data, instream, LLSDSerialize::SIZE_UNLIMITED); +            // todo: this is likely very expensive to parse, should use binary +            LLSDSerialize::fromBinary(in_data, instream, LLSDSerialize::SIZE_UNLIMITED);              instream.close(); -            if (old_cache_version == current_cache_version) +            if (old_cache_version == current_cache_version +                && in_data["version"].asUUID() == current_cache_version)              { -                for (const auto& data_pair : llsd::inMap(in_data)) +                for (const auto& data_pair : llsd::inMap(in_data["shaders"]))                  {                      ProgramBinaryData binary_info = ProgramBinaryData();                      binary_info.mBinaryFormat = data_pair.second["binary_format"].asInteger(); @@ -1025,11 +1029,15 @@ void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version,                      mShaderBinaryCache.insert_or_assign(LLUUID(data_pair.first), binary_info);                  }              } -            else +            else if (!second_instance)              { -                LL_INFOS() << "Shader cache version mismatch detected. Purging." << LL_ENDL; +                LL_INFOS("ShaderMgr") << "Shader cache version mismatch detected. Purging." << LL_ENDL;                  clearShaderCache();              } +            else +            { +                LL_INFOS("ShaderMgr") << "Shader cache version mismatch detected." << LL_ENDL; +            }          }      }  } @@ -1037,7 +1045,7 @@ void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version,  void LLShaderMgr::clearShaderCache()  {      std::string shader_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "shader_cache"); -    LL_INFOS() << "Removing shader cache at " << shader_cache << LL_ENDL; +    LL_INFOS("ShaderMgr") << "Removing shader cache at " << shader_cache << LL_ENDL;      const std::string mask = "*";      gDirUtilp->deleteFilesInDir(shader_cache, mask);      mShaderBinaryCache.clear(); @@ -1046,10 +1054,22 @@ void LLShaderMgr::clearShaderCache()  void LLShaderMgr::persistShaderCacheMetadata()  {      if(!mShaderCacheEnabled) return; +    if (mShaderCacheVersion.isNull()) +    { +        LL_WARNS("ShaderMgr") << "Attempted to save shader cache with no version set" << LL_ENDL; +        return; +    } -    LL_INFOS() << "Persisting shader cache metadata to disk" << LL_ENDL; +    LL_INFOS("ShaderMgr") << "Persisting shader cache metadata to disk" << LL_ENDL; -    LLSD out = LLSD::emptyMap(); +    LLSD out; +    // Settings and shader cache get saved at different time, thus making +    // RenderShaderCacheVersion unreliable when running multiple viewer +    // instances, or for cases where viewer crashes before saving settings. +    // Dupplicate version to the cache itself. +    out["version"] = mShaderCacheVersion; +    out["shaders"] = LLSD::emptyMap(); +    LLSD &shaders = out["shaders"];      static const F32 LRU_TIME = (60.f * 60.f) * 24.f * 7.f; // 14 days      const F32 current_time = (F32)LLTimer::getTotalSeconds(); @@ -1068,14 +1088,19 @@ void LLShaderMgr::persistShaderCacheMetadata()              data["binary_format"] = LLSD::Integer(shader_metadata.mBinaryFormat);              data["binary_size"] = LLSD::Integer(shader_metadata.mBinaryLength);              data["last_used"] = LLSD::Real(shader_metadata.mLastUsedTime); -            out[it->first.asString()] = data; +            shaders[it->first.asString()] = data;              ++it;          }      }      std::string meta_out_path = gDirUtilp->add(mShaderCacheDir, "shaderdata.llsd"); -    llofstream outstream(meta_out_path); -    LLSDSerialize::toNotation(out, outstream); +    llofstream outstream(meta_out_path, std::ios_base::out | std::ios_base::binary); +    if (!outstream.is_open()) +    { +        LL_WARNS("ShaderMgr") << "Failed to open file. Unable to save shader cache to: " << mShaderCacheDir << LL_ENDL; +        return; +    } +    LLSDSerialize::toBinary(out, outstream);      outstream.close();  } diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 19416066a5..4cfa78632b 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -377,7 +377,7 @@ public:      // Implemented in the application to actually update out of date uniforms for a particular shader      virtual void updateShaderUniforms(LLGLSLShader * shader) = 0; // Pure Virtual -    void initShaderCache(bool enabled, const LLUUID& old_cache_version, const LLUUID& current_cache_version); +    void initShaderCache(bool enabled, const LLUUID& old_cache_version, const LLUUID& current_cache_version, bool second_instance);      void clearShaderCache();      void persistShaderCacheMetadata(); @@ -401,7 +401,7 @@ public:          F32 mLastUsedTime = 0.0;      };      std::map<LLUUID, ProgramBinaryData> mShaderBinaryCache; -    bool mShaderCacheInitialized = false; +    LLUUID mShaderCacheVersion;      bool mShaderCacheEnabled = false;      std::string mShaderCacheDir; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 382847d68f..3fe0df1848 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -2235,6 +2235,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)      registrar.add("Url.RemoveFriend", boost::bind(&LLUrlAction::removeFriend, url));      registrar.add("Url.ReportAbuse", boost::bind(&LLUrlAction::reportAbuse, url));      registrar.add("Url.SendIM", boost::bind(&LLUrlAction::sendIM, url)); +    registrar.add("Url.ZoomInObject", boost::bind(&LLUrlAction::zoomInObject, url));      registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));      registrar.add("Url.ShowParcelOnMap", boost::bind(&LLUrlAction::showParcelOnMap, url));      registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url)); @@ -3764,7 +3765,7 @@ bool LLNormalTextSegment::getDimensionsF32(S32 first_char, S32 num_chars, F32& w  {      height = 0;      width = 0; -    if (num_chars > 0) +    if (num_chars > 0 && (mStart + first_char >= 0))      {          height = mFontHeight;          const LLWString &text = getWText(); diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp index fdae22cfa1..8b320b59cc 100644 --- a/indra/llui/llurlaction.cpp +++ b/indra/llui/llurlaction.cpp @@ -117,6 +117,16 @@ void LLUrlAction::teleportToLocation(std::string url)      }  } +void LLUrlAction::zoomInObject(std::string url) +{ +    LLUrlMatch match; +    std::string object_id = getObjectId(url); +    if (LLUUID::validate(object_id) && LLUrlRegistry::instance().findUrl(url, match)) +    { +        executeSLURL("secondlife:///app/object/" + object_id + "/zoomin/" + match.getLocation()); +    } +} +  void LLUrlAction::showLocationOnMap(std::string url)  {      LLUrlMatch match; diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h index 8b7ab0e7c5..56d459bb26 100644 --- a/indra/llui/llurlaction.h +++ b/indra/llui/llurlaction.h @@ -60,6 +60,10 @@ public:      /// if the Url specifies an SL location, teleport there      static void teleportToLocation(std::string url); +    /// If the Url specifies an object id, attempt to zoom in. +    /// If not possible to zoom in, show on map +    static void zoomInObject(std::string url); +      /// if the Url specifies an SL location, show it on a map      static void showLocationOnMap(std::string url); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 750bd3a523..dabad38f99 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -403,6 +403,7 @@ set(viewer_SOURCE_FILES      llmaniprotate.cpp      llmanipscale.cpp      llmaniptranslate.cpp +    llfloatermarketplace.cpp      llmarketplacefunctions.cpp      llmarketplacenotifications.cpp      llmaterialeditor.cpp @@ -951,6 +952,7 @@ set(viewer_HEADER_FILES      llfloaterlinkreplace.h      llfloaterloadprefpreset.h      llfloatermap.h +    llfloatermarketplace.h      llfloatermarketplacelistings.h      llfloatermediasettings.h      llfloatermemleak.h @@ -1447,7 +1449,7 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt"             "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\n")  set_source_files_properties( -   llversioninfo.cpp tests/llversioninfo_test.cpp  +   llversioninfo.cpp tests/llversioninfo_test.cpp     PROPERTIES     COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake     ) @@ -1665,7 +1667,7 @@ endif (WINDOWS)  file(GLOB_RECURSE viewer_XUI_FILES LIST_DIRECTORIES FALSE      ${CMAKE_CURRENT_SOURCE_DIR}/skins/*.xml)  source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/skins PREFIX "XUI Files" FILES ${viewer_XUI_FILES}) -set_source_files_properties(${viewer_XUI_FILES}  +set_source_files_properties(${viewer_XUI_FILES}                              PROPERTIES HEADER_FILE_ONLY TRUE)  list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES}) @@ -1673,7 +1675,7 @@ list(APPEND viewer_SOURCE_FILES ${viewer_XUI_FILES})  file(GLOB_RECURSE viewer_SHADER_FILES LIST_DIRECTORIES FALSE      ${CMAKE_CURRENT_SOURCE_DIR}/app_settings/shaders/*.glsl)  source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR}/app_settings/shaders PREFIX "Shaders" FILES ${viewer_SHADER_FILES}) -set_source_files_properties(${viewer_SHADER_FILES}  +set_source_files_properties(${viewer_SHADER_FILES}                              PROPERTIES HEADER_FILE_ONLY TRUE)  list(APPEND viewer_SOURCE_FILES ${viewer_SHADER_FILES}) @@ -1698,7 +1700,7 @@ set(viewer_APPSETTINGS_FILES      app_settings/toolbars.xml      app_settings/trees.xml      app_settings/viewerart.xml -    ${CMAKE_SOURCE_DIR}/../etc/message.xml +    app_settings/message.xml      ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg      #packages-info.txt      featuretable.txt @@ -1885,7 +1887,7 @@ if (WINDOWS)      set(COPY_INPUT_DEPENDENCIES        # The following commented dependencies are determined at variably at build time. Can't do this here. -      ${CMAKE_SOURCE_DIR}/../etc/message.xml +      app_settings/message.xml        ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg        ${SHARED_LIB_STAGING_DIR}/openjp2.dll        ${SHARED_LIB_STAGING_DIR}/llwebrtc.dll @@ -2107,7 +2109,7 @@ endif (WINDOWS)  # one of these being libz where you can find four or more versions in play  # at once.  On Linux, libz can be found at link and run time via a number  # of paths: -#      +#  #      => -lfreetype  #        => libz.so.1 (on install machine, not build)  #      => -lSDL @@ -2251,7 +2253,7 @@ foreach(elem ${country_codes})     set(emoji_mapping_src_file        "${emoji_mapping_src_folder}/${elem}/emoji_characters.xml")     set(emoji_mapping_dst_file -      "${emoji_mapping_dst_folder}/${elem}/emoji_characters.xml")       +      "${emoji_mapping_dst_folder}/${elem}/emoji_characters.xml")     configure_file(${emoji_mapping_src_file} ${emoji_mapping_dst_file} COPYONLY)  endforeach() @@ -2427,7 +2429,7 @@ if (DARWIN)    # https://blog.kitware.com/upcoming-in-cmake-2-8-12-osx-rpath-support/    set(CMAKE_MACOSX_RPATH 1) -   +    set_target_properties(      ${VIEWER_BINARY_NAME}      PROPERTIES @@ -2477,9 +2479,6 @@ if (DARWIN)        --grid=${GRID}        --source=${CMAKE_CURRENT_SOURCE_DIR}        --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt -    DEPENDS -      ${VIEWER_BINARY_NAME} -      ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py      )    endif () @@ -2533,8 +2532,6 @@ if (DARWIN)                --touch=${CMAKE_CURRENT_BINARY_DIR}/$<IF:$<BOOL:${LL_GENERATOR_IS_MULTI_CONFIG}>,$<CONFIG>,>/.${product}.bat                --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt                ${SIGNING_SETTING} -        DEPENDS -          ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py        )      endif ()    endif (PACKAGE) @@ -2578,7 +2575,7 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE              PROPERTIES              XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym"              XCODE_ATTRIBUTE_DWARF_DSYM_FOLDER_PATH "${SYMBOLS_STAGING_DIR}/dSYMs") -     +        add_custom_command(OUTPUT "${VIEWER_APP_XCARCHIVE}"          COMMAND "zip"          ARGS @@ -2613,7 +2610,7 @@ if (LL_TESTS)  #    llremoteparcelrequest.cpp      llviewerhelputil.cpp      llversioninfo.cpp -#    llvocache.cpp   +#    llvocache.cpp      llworldmap.cpp      llworldmipmap.cpp    ) @@ -2622,7 +2619,7 @@ if (LL_TESTS)      llworldmap.cpp      llworldmipmap.cpp      PROPERTIES -    LL_TEST_ADDITIONAL_SOURCE_FILES  +    LL_TEST_ADDITIONAL_SOURCE_FILES      tests/llviewertexture_stub.cpp      #llviewertexturelist.cpp    ) @@ -2656,7 +2653,7 @@ if (LL_TESTS)      llworldmap.cpp      llworldmipmap.cpp      PROPERTIES -    LL_TEST_ADDITIONAL_SOURCE_FILES  +    LL_TEST_ADDITIONAL_SOURCE_FILES      tests/llviewertexture_stub.cpp    ) diff --git a/indra/newview/ViewerInstall.cmake b/indra/newview/ViewerInstall.cmake index 5ae53bcd3a..2a13ea1d93 100644 --- a/indra/newview/ViewerInstall.cmake +++ b/indra/newview/ViewerInstall.cmake @@ -54,7 +54,6 @@ if (DARWIN)      install(FILES          ${SCRIPTS_DIR}/messages/message_template.msg -        ${SCRIPTS_DIR}/../etc/message.xml          ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt          DESTINATION app_settings          ) @@ -109,7 +108,6 @@ elseif (WINDOWS)      install(FILES          ${SCRIPTS_DIR}/messages/message_template.msg -        ${SCRIPTS_DIR}/../etc/message.xml          ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt          DESTINATION app_settings          ) @@ -250,7 +248,6 @@ endif (IS_ARTWORK_PRESENT)          )  install(FILES ${SCRIPTS_DIR}/messages/message_template.msg -        ${SCRIPTS_DIR}/../etc/message.xml          ${CMAKE_CURRENT_BINARY_DIR}/contributors.txt          DESTINATION share/${VIEWER_BINARY_NAME}/app_settings          ) diff --git a/etc/message.xml b/indra/newview/app_settings/message.xml index dee3fd72dd..dee3fd72dd 100755 --- a/etc/message.xml +++ b/indra/newview/app_settings/message.xml diff --git a/indra/newview/gltf/asset.cpp b/indra/newview/gltf/asset.cpp index 9c394e19d4..f7a5a20872 100644 --- a/indra/newview/gltf/asset.cpp +++ b/indra/newview/gltf/asset.cpp @@ -589,7 +589,9 @@ bool Asset::prep()                  for (U32 variant = 0; variant < LLGLSLShader::NUM_GLTF_VARIANTS; ++variant)                  { +#ifdef SHOW_ASSERT                      U32 attribute_mask = 0; +#endif                      // for each mesh                      for (auto& mesh : mMeshes)                      { @@ -607,7 +609,9 @@ bool Asset::prep()                                  // all primitives of a given variant and material should all have the same attribute mask                                  llassert(attribute_mask == 0 || primitive.mAttributeMask == attribute_mask); +#ifdef SHOW_ASSERT                                  attribute_mask |= primitive.mAttributeMask; +#endif                              }                          }                      } diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 77f24ac6a6..0e36698018 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -164,6 +164,74 @@ Var DO_UNINSTALL_V2     # If non-null, path to a previous Viewer 2 installation  !include "x64.nsh"			# for 64bit detection
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +;; Substring function
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +!define StrStr "!insertmacro StrStr"
 + 
 +!macro StrStr ResultVar String SubString
 +  Push `${String}`
 +  Push `${SubString}`
 +  Call StrStr
 +  Pop `${ResultVar}`
 +!macroend
 + 
 +Function StrStr
 +
 +# After this point:
 +# ------------------------------------------
 +# $R0 = SubString (input)
 +# $R1 = String (input)
 +# $R2 = SubStringLen (temp)
 +# $R3 = StrLen (temp)
 +# $R4 = StartCharPos (temp)
 +# $R5 = TempStr (temp)
 +# function from nsis.sourceforge.io/StrStr
 + 
 +  ;Get input from user
 +  Exch $R0
 +  Exch
 +  Exch $R1
 +  Push $R2
 +  Push $R3
 +  Push $R4
 +  Push $R5
 + 
 +  ;Get "String" and "SubString" length
 +  StrLen $R2 $R0
 +  StrLen $R3 $R1
 +  ;Start "StartCharPos" counter
 +  StrCpy $R4 0
 + 
 +  ;Loop until "SubString" is found or "String" reaches its end
 +  ${Do}
 +    ;Remove everything before and after the searched part ("TempStr")
 +    StrCpy $R5 $R1 $R2 $R4
 + 
 +    ;Compare "TempStr" with "SubString"
 +    ${IfThen} $R5 == $R0 ${|} ${ExitDo} ${|}
 +    ;If not "SubString", this could be "String"'s end
 +    ${IfThen} $R4 >= $R3 ${|} ${ExitDo} ${|}
 +    ;If not, continue the loop
 +    IntOp $R4 $R4 + 1
 +  ${Loop}
 + 
 +# After this point:
 +# ------------------------------------------
 +# $R0 = ResultVar (output)
 + 
 +  ;Remove part before "SubString" on "String" (if there has one)
 +  StrCpy $R0 $R1 `` $R4
 + 
 +  ;Return output to user
 +  Pop $R5
 +  Pop $R4
 +  Pop $R3
 +  Pop $R2
 +  Pop $R1
 +  Exch $R0
 +FunctionEnd
 +
 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Pre-directory page callback
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  Function dirPre
 @@ -190,15 +258,31 @@ Function .onInit  # However, SL-10506 complains about the resulting behavior, so the logic below
  # is adapted from before we introduced MultiUser.nsh.
 +# Check if user specified /D= on the command line
 +System::Call 'kernel32::GetCommandLine()t .r0'
 +Push $0
 +Push " /D="
 +Call StrStr
 +Pop $1
 +${If} $1 != ""
 +    # /D= was specified, extract the path
 +    # spaces are allowed in path after /D=, it's expected to be the last parameter
 +    StrLen $2 $1 
 +    StrCpy $INSTDIR $1 $2 4	# Skip over " /D="
 +    Goto after_instdir
 +${EndIf}
 +
  # if $0 is empty, this is the first time for this viewer name
  ReadRegStr $0 SHELL_CONTEXT "${INSTNAME_KEY}" ""
  # viewer with this name was installed before
  ${If} $0 != ""
 -	# use the value we got from registry as install location
 +    # use the value we got from registry as install location
      StrCpy $INSTDIR $0
  ${EndIf}
 +after_instdir:
 +
  Call CheckCPUFlags							# Make sure we have SSE2 support
  Call CheckWindowsVersion					# Don't install On unsupported systems
      Push $0
 diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 4e08f7219d..b6d31c0cae 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -1754,7 +1754,6 @@ F32 LLAgentCamera::calcCameraFOVZoomFactor()  LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit)  {      // Compute base camera position and look-at points. -    F32         camera_land_height;      LLVector3d  frame_center_global = !isAgentAvatarValid() ?          gAgent.getPositionGlobal() :          gAgent.getPosGlobalFromAgent(getAvatarRootPosition()); @@ -1991,10 +1990,11 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(bool *hit_limit)          }      } -    // Don't let camera go underground -    F32 camera_min_off_ground = getCameraMinOffGround(); -    camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global); -    F32 minZ = llmax(F_ALMOST_ZERO, camera_land_height + camera_min_off_ground); +    // Don't let camera go underground if constrained +    // If not constrained, permit going 1000m below 0, use case: retrieving objects +    F32 camera_min_off_ground = getCameraMinOffGround(); // checks isDisableCameraConstraints +    F32 camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global); +    F32 minZ = camera_land_height + camera_min_off_ground;      if (camera_position_global.mdV[VZ] < minZ)      {          camera_position_global.mdV[VZ] = minZ; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 551d4fc5d9..98a1fd740b 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -4594,6 +4594,7 @@ void LLAppViewer::forceDisconnect(const std::string& mesg)      }      else      { +        sendSimpleLogoutRequest();          args["MESSAGE"] = big_reason;          LLNotificationsUtil::add("YouHaveBeenLoggedOut", args, LLSD(), &finish_disconnect );      } @@ -5374,6 +5375,27 @@ void LLAppViewer::sendLogoutRequest()      }  } +void LLAppViewer::sendSimpleLogoutRequest() +{ +    if (!mLogoutRequestSent && gMessageSystem) +    { +        gLogoutInProgress = true; + +        LLMessageSystem* msg = gMessageSystem; +        msg->newMessageFast(_PREHASH_LogoutRequest); +        msg->nextBlockFast(_PREHASH_AgentData); +        msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +        msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +        gAgent.sendReliableMessage(); + +        LL_INFOS("Agent") << "Logging out as agent: " << gAgent.getID() << " Session: " << gAgent.getSessionID() << LL_ENDL; + +        gLogoutTimer.reset(); +        gLogoutMaxTime = LOGOUT_REQUEST_TIME; +        mLogoutRequestSent = true; +    } +} +  void LLAppViewer::updateNameLookupUrl(const LLViewerRegion * regionp)  {      if (!regionp || !regionp->capabilitiesReceived()) diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 132d7bfe25..e7de2d9b28 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -310,6 +310,10 @@ private:      void sendLogoutRequest();      void disconnectViewer(); +    // Does not create a marker file. For lost network case, +    // to at least attempt to remove the ghost from the world. +    void sendSimpleLogoutRequest(); +      // *FIX: the app viewer class should be some sort of singleton, no?      // Perhaps its child class is the singleton and this should be an abstract base.      static LLAppViewer* sInstance; diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 211bc5f7a9..21a29bb1bb 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -189,7 +189,14 @@ public:              std::string url = "secondlife://" + mObjectData["slurl"].asString();              LLUrlAction::teleportToLocation(url);          } - +        else if (level == "obj_zoom_in") +        { +            LLUUID obj_id = mObjectData["object_id"]; +            if (obj_id.notNull()) +            { +                handle_zoom_to_object(obj_id); +            } +        }      }      bool onObjectIconContextMenuItemVisible(const LLSD& userdata) @@ -203,6 +210,15 @@ public:          {              return !LLMuteList::getInstance()->isMuted(getAvatarId(), mFrom, LLMute::flagTextChat);          } +        else if (level == "obj_zoom_in") +        { +            LLUUID obj_id = mObjectData["object_id"]; +            if (obj_id.notNull()) +            { +                return nullptr != gObjectList.findObject(mAvatarID); +            } +            return false; +        }          return false;      } diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 550dfeb802..5ac4ce0d52 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -37,6 +37,8 @@  #include "lllocalcliprect.h"  #include "lltrans.h"  #include "llfloaterimnearbychat.h" +#include "llfloaterworldmap.h" +#include "llviewermenu.h"  #include "llviewercontrol.h"  #include "llagentdata.h" @@ -75,6 +77,23 @@ public:              return true;          } +        if (verb == "zoomin") +        { +            if (!handle_zoom_to_object(object_id) && params.size() > 2) +            { +                // zoom faled, show location +                // secondlife:///app/object/object_id/zoomin/{LOCATION}/{COORDS} SLapp +                const std::string region_name = LLURI::unescape(params[0].asString()); +                S32 x = (params.size() > 1) ? params[1].asInteger() : 128; +                S32 y = (params.size() > 2) ? params[2].asInteger() : 128; +                S32 z = (params.size() > 3) ? params[3].asInteger() : 0; + +                LLFloaterWorldMap::getInstance()->trackURL(region_name, x, y, z); +                LLFloaterReg::showInstance("world_map", "center"); +            } +            return true; +        } +          return false;      }  }; diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 424bb02ae7..7a974fe857 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -144,7 +144,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)      gGL.setColorMask(true, true);      LLColor3 light_diffuse(0, 0, 0); -    F32      light_exp = 0.0f;      LLEnvironment& environment = LLEnvironment::instance();      LLSettingsWater::ptr_t pwater = environment.getCurrentWater(); @@ -171,7 +170,6 @@ void LLDrawPoolWater::renderPostDeferred(S32 pass)      // Apply magic numbers translating light direction into intensities      light_dir.normalize();      F32 ground_proj_sq = light_dir.mV[0] * light_dir.mV[0] + light_dir.mV[1] * light_dir.mV[1]; -    light_exp          = llmax(32.f, 256.f * powf(ground_proj_sq, 16.0f));      if (0.f < light_diffuse.normalize())  // Normalizing a color? Puzzling...      {          light_diffuse *= (1.5f + (6.f * ground_proj_sq)); diff --git a/indra/newview/llfloatermarketplace.cpp b/indra/newview/llfloatermarketplace.cpp new file mode 100644 index 0000000000..889daf84ab --- /dev/null +++ b/indra/newview/llfloatermarketplace.cpp @@ -0,0 +1,47 @@ +/** + * @file llfloatermarketplace.cpp + * @brief floater for the Marketplace web site + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloatermarketplace.h" +#include "lluictrlfactory.h" + +LLFloaterMarketplace::LLFloaterMarketplace(const LLSD& key) +    :   LLFloater(key) +{ +} + +LLFloaterMarketplace::~LLFloaterMarketplace() +{ +} + +bool LLFloaterMarketplace::postBuild() +{ +    enableResizeCtrls(true, true, false); +    return true; +} + + diff --git a/indra/newview/llfloatermarketplace.h b/indra/newview/llfloatermarketplace.h new file mode 100644 index 0000000000..2ae4d0d64a --- /dev/null +++ b/indra/newview/llfloatermarketplace.h @@ -0,0 +1,40 @@ +/** + * @file llfloatermarketplace.h + * @brief floater for the Marketplace web site + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#pragma once + +#include "llfloater.h" + +class LLFloaterMarketplace: +    public LLFloater +{ +    friend class LLFloaterReg; +private: +    LLFloaterMarketplace(const LLSD& key); +    ~LLFloaterMarketplace(); +    bool postBuild() override; +}; + diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 99b871b484..d9753596e6 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -758,6 +758,7 @@ void LLFloaterPreference::onOpen(const LLSD& key)      // Forget previous language changes.      mLanguageChanged = false; +    mLastQualityLevel = gSavedSettings.getU32("RenderQualityPerformance");      // Display selected maturity icons.      onChangeMaturity(); @@ -1327,6 +1328,33 @@ void LLFloaterPreference::onCommitWindowedMode()  void LLFloaterPreference::onChangeQuality(const LLSD& data)  {      U32 level = (U32)(data.asReal()); +    constexpr U32 LVL_HIGH = 4; +    if (level >= LVL_HIGH && mLastQualityLevel < level) +    { +        constexpr U32 LOW_MEM_THRESHOLD = 4097; +        U32 total_mem = (U32Megabytes)LLMemory::getMaxMemKB(); +        if (total_mem < LOW_MEM_THRESHOLD) +        { +            LLSD args; +            args["TOTAL_MEM"] = LLSD::Integer(total_mem); +            LLNotificationsUtil::add("PreferenceQualityWithLowMemory", args, LLSD(), [this](const LLSD& notification, const LLSD& response) +            { +                S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +                // If cancel pressed +                if (option == 1) +                { +                    constexpr U32 LVL_MED_PLUS = 3; +                    gSavedSettings.setU32("RenderQualityPerformance", LVL_MED_PLUS); +                    mLastQualityLevel = LVL_MED_PLUS; +                    LLFeatureManager::getInstance()->setGraphicsLevel(LVL_MED_PLUS, true); +                    refreshEnabledGraphics(); +                    refresh(); +                } +            } +            ); +        } +    } +    mLastQualityLevel = level;      LLFeatureManager::getInstance()->setGraphicsLevel(level, true);      refreshEnabledGraphics();      refresh(); diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 2c357f0551..c2d7d34287 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -218,6 +218,7 @@ private:      bool mGotPersonalInfo;      bool mLanguageChanged;      bool mAvatarDataInitialized; +    U32 mLastQualityLevel = 0;      std::string mPriorInstantMessageLogPath;      bool mOriginalHideOnlineStatus; diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index d3c8bf3451..9762154a26 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -1,11 +1,10 @@  /**   * @file llfloatersearch.cpp - * @author Martin Reddy - * @brief Search floater - uses an embedded web browser control + * @brief Floater for Search (update 2025, preload)   * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * $LicenseInfo:firstyear=2011&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2011, Linden Research, Inc.   *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public @@ -27,68 +26,34 @@  #include "llviewerprecompiledheaders.h" +#include "llfloatersearch.h" + +#include "llagent.h"  #include "llcommandhandler.h"  #include "llfloaterreg.h" -#include "llfloatersearch.h" -#include "llhttpconstants.h"  #include "llmediactrl.h" -#include "llnotificationsutil.h" -#include "lllogininstance.h" -#include "lluri.h" -#include "llagent.h" -#include "llui.h" +#include "lluictrlfactory.h"  #include "llviewercontrol.h"  #include "llweb.h"  // support secondlife:///app/search/{CATEGORY}/{QUERY} SLapps -class LLSearchHandler : public LLCommandHandler -{ -public: -    // requires trusted browser to trigger -    LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_CLICK_ONLY) { } -    bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) -    { -        const size_t parts = tokens.size(); - -        // get the (optional) category for the search -        std::string collection; -        if (parts > 0) -        { -            collection = tokens[0].asString(); +class LLSearchHandler : public LLCommandHandler { +    public: +        // requires trusted browser to trigger +        LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_CLICK_ONLY) { } +        bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web) { +            const size_t parts = tokens.size(); + +            // open the search floater and perform the requested search +            LLFloaterReg::showInstance("search", tokens); +            return true;          } - -        // get the (optional) search string -        std::string search_text; -        if (parts > 1) -        { -            search_text = tokens[1].asString(); -        } - -        // create the LLSD arguments for the search floater -        LLFloaterSearch::Params p; -        p.search.collection = collection; -        p.search.query = LLURI::unescape(search_text); - -        // open the search floater and perform the requested search -        LLFloaterReg::showInstance("search", p); -        return true; -    }  };  LLSearchHandler gSearchHandler; -LLFloaterSearch::SearchQuery::SearchQuery() -:   category("category", ""), -    collection("collection", ""), -    query("query") -{} - -LLFloaterSearch::LLFloaterSearch(const Params& key) : -    LLFloaterWebContent(key), -    mSearchGodLevel(0) +LLFloaterSearch::LLFloaterSearch(const LLSD& key) +    : LLFloater(key)  { -    // declare a map that transforms a category name into -    // the URL suffix that is used to search that category -      mSearchType.insert("standard");      mSearchType.insert("land");      mSearchType.insert("classified"); @@ -100,76 +65,61 @@ LLFloaterSearch::LLFloaterSearch(const Params& key) :      mCollectionType.insert("people");  } -bool LLFloaterSearch::postBuild() +LLFloaterSearch::~LLFloaterSearch()  { -    LLFloaterWebContent::postBuild(); -    mWebBrowser->addObserver(this); - -    return true;  } -void LLFloaterSearch::onOpen(const LLSD& key) +void LLFloaterSearch::onOpen(const LLSD& tokens)  { -    Params p(key); -    p.trusted_content = true; -    p.allow_address_entry = false; - -    LLFloaterWebContent::onOpen(p); -    mWebBrowser->setFocus(true); -    search(p.search); +    initiateSearch(tokens);  } -void LLFloaterSearch::onClose(bool app_quitting) +void LLFloaterSearch::initiateSearch(const LLSD& tokens)  { -    LLFloaterWebContent::onClose(app_quitting); -    // tear down the web view so we don't show the previous search -    // result when the floater is opened next time -    destroy(); -} +    std::string url = gSavedSettings.getString("SearchURL"); -void LLFloaterSearch::godLevelChanged(U8 godlevel) -{ -    // search results can change based upon god level - if the user -    // changes god level, then give them a warning (we don't refresh -    // the search as this might undo any page navigation or -    // AJAX-driven changes since the last search). +    LLSD subs; -    //FIXME: set status bar text +    // Setting this substitution here results in a full set of collections being +    // substituted into the final URL using the logic from the original search. +    subs["TYPE"] = "standard"; -    //getChildView("refresh_search")->setVisible( (godlevel != mSearchGodLevel)); -} +    const size_t parts = tokens.size(); -void LLFloaterSearch::search(const SearchQuery &p) -{ -    if (! mWebBrowser || !p.validateBlock()) +    // get the (optional) category for the search +    std::string collection; +    if (parts > 0)      { -        return; +        collection = tokens[0].asString();      } -    // reset the god level warning as we're sending the latest state -    getChildView("refresh_search")->setVisible(false); -    mSearchGodLevel = gAgent.getGodLevel(); +    // get the (optional) search string +    std::string search_text; +    if (parts > 1) +    { +        search_text = tokens[1].asString(); +    } -    // work out the subdir to use based on the requested category -    LLSD subs; -    if (mSearchType.find(p.category) != mSearchType.end()) +    // TODO: where does category get set? I cannot find a reference to +    // it in internal docs - might be conflated with values in mSearchType +    std::string category; +    if (mSearchType.find(category) != mSearchType.end())      { -        subs["TYPE"] = p.category; +        subs["TYPE"] = category;      }      else      {          subs["TYPE"] = "standard";      } -    // add the search query string -    subs["QUERY"] = LLURI::escape(p.query); +    subs["QUERY"] = LLURI::escape(search_text);      subs["COLLECTION"] = "";      if (subs["TYPE"] == "standard")      { -        if (mCollectionType.find(p.collection) != mCollectionType.end()) +        if (mCollectionType.find(collection) != mCollectionType.end())          { -            subs["COLLECTION"] = "&collection_chosen=" + std::string(p.collection); +            subs["COLLECTION"] = "&collection_chosen=" + std::string(collection);          }          else          { @@ -182,30 +132,41 @@ void LLFloaterSearch::search(const SearchQuery &p)          }      } -    // add the user's preferred maturity (can be changed via prefs) -    std::string maturity; +    // Default to PG +    std::string maturity = "g";      if (gAgent.prefersAdult())      { -        maturity = "gma";  // PG,Mature,Adult +        // PG,Mature,Adult +        maturity = "gma";      }      else if (gAgent.prefersMature())      { -        maturity = "gm";  // PG,Mature -    } -    else -    { -        maturity = "g";  // PG +        // PG,Mature +        maturity = "gm";      }      subs["MATURITY"] = maturity; -    // add the user's god status +    // God status      subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0"; -    // get the search URL and expand all of the substitutions -    // (also adds things like [LANGUAGE], [VERSION], [OS], etc.) -    std::string url = gSavedSettings.getString("SearchURL"); +    // This call expands a set of generic substitutions like language, viewer version +    // etc. and then also does the same with the list of subs passed in.      url = LLWeb::expandURLSubstitutions(url, subs); -    // and load the URL in the web view -    mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML); +    // Naviation to the calculated URL - we know it's HTML so we can +    // tell the media system not to bother with the MIME type check. +    LLMediaCtrl* search_browser = findChild<LLMediaCtrl>("search_contents"); +    search_browser->navigateTo(url, HTTP_CONTENT_TEXT_HTML); +} + +bool LLFloaterSearch::postBuild() +{ +    enableResizeCtrls(true, true, false); + +    // This call is actioned by the preload code in llViewerWindow +    // that creates the search floater during the login process +    // using a generic search with no query +    initiateSearch(LLSD()); + +    return true;  } diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h index beaac2ad2f..e8a2be4797 100644 --- a/indra/newview/llfloatersearch.h +++ b/indra/newview/llfloatersearch.h @@ -1,11 +1,10 @@  /**   * @file llfloatersearch.h - * @author Martin Reddy - * @brief Search floater - uses an embedded web browser control + * @brief Floater for Search (update 2025, preload)   * - * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * $LicenseInfo:firstyear=2011&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2011, Linden Research, Inc.   *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public @@ -25,70 +24,23 @@   * $/LicenseInfo$   */ -#ifndef LL_LLFLOATERSEARCH_H -#define LL_LLFLOATERSEARCH_H +#pragma once -#include "llfloaterwebcontent.h" -#include "llviewermediaobserver.h" +#include "llfloater.h" -#include <string> +class LLFloaterSearch: +    public LLFloater { +        friend class LLFloaterReg; -class LLMediaCtrl; +    public: +        void onOpen(const LLSD& key) override; -/// -/// The search floater allows users to perform all search operations. -/// All search functionality is now implemented via web services and -/// so this floater simply embeds a web view and displays the search -/// web page. The browser control is explicitly marked as "trusted" -/// so that the user can click on teleport links in search results. -/// -class LLFloaterSearch : -    public LLFloaterWebContent -{ -public: -    struct SearchQuery : public LLInitParam::Block<SearchQuery> -    { -        Optional<std::string> category; -        Optional<std::string> collection; -        Optional<std::string> query; +    private: +        LLFloaterSearch(const LLSD& key); +        ~LLFloaterSearch(); +        void initiateSearch(const LLSD& tokens); +        bool postBuild() override; -        SearchQuery(); -    }; - -    struct _Params : public LLInitParam::Block<_Params, LLFloaterWebContent::Params> -    { -        Optional<SearchQuery> search; -    }; - -    typedef LLSDParamAdapter<_Params> Params; - -    LLFloaterSearch(const Params& key); - -    /// show the search floater with a new search -    /// see search() for details on the key parameter. -    /*virtual*/ void onOpen(const LLSD& key); - -    /*virtual*/ void onClose(bool app_quitting); - -    /// perform a search with the specific search term. -    /// The key should be a map that can contain the following keys: -    ///  - "id": specifies the text phrase to search for -    ///  - "category": one of "all" (default), "people", "places", -    ///    "events", "groups", "wiki", "destinations", "classifieds" -    void search(const SearchQuery &query); - -    /// changing godmode can affect the search results that are -    /// returned by the search website - use this method to tell the -    /// search floater that the user has changed god level. -    void godLevelChanged(U8 godlevel); - -private: -    /*virtual*/ bool postBuild(); - -    std::set<std::string> mSearchType; -    std::set<std::string> mCollectionType; -    U8          mSearchGodLevel; +        std::set<std::string> mSearchType; +        std::set<std::string> mCollectionType;  }; - -#endif  // LL_LLFLOATERSEARCH_H - diff --git a/indra/newview/llhudeffectresetskeleton.cpp b/indra/newview/llhudeffectresetskeleton.cpp index 31065a3e76..2bb5696f59 100644 --- a/indra/newview/llhudeffectresetskeleton.cpp +++ b/indra/newview/llhudeffectresetskeleton.cpp @@ -56,6 +56,15 @@ LLHUDEffectResetSkeleton::~LLHUDEffectResetSkeleton()  //-----------------------------------------------------------------------------  // packData()  //----------------------------------------------------------------------------- +void LLHUDEffectResetSkeleton::render() +{ +    // HUDEffectResetSkeleton is a fake effect meant to reset skeleton only. +    // Just wait for an update() call to do its work and then die. +} + +//----------------------------------------------------------------------------- +// packData() +//-----------------------------------------------------------------------------  void LLHUDEffectResetSkeleton::packData(LLMessageSystem *mesgsys)  {      // Pack the default data diff --git a/indra/newview/llhudeffectresetskeleton.h b/indra/newview/llhudeffectresetskeleton.h index 39a6137054..c89516d7fc 100644 --- a/indra/newview/llhudeffectresetskeleton.h +++ b/indra/newview/llhudeffectresetskeleton.h @@ -38,20 +38,21 @@ class LLHUDEffectResetSkeleton final : public LLHUDEffect  public:      friend class LLHUDObject; -    /*virtual*/ void markDead(); -    /*virtual*/ void setSourceObject(LLViewerObject* objectp); +    /*virtual*/ void markDead() override; +    /*virtual*/ void setSourceObject(LLViewerObject* objectp) override; -    void setTargetObject(LLViewerObject *objp); +    void setTargetObject(LLViewerObject *objp) override;      void setResetAnimations(bool enable){ mResetAnimations = enable; };  protected:      LLHUDEffectResetSkeleton(const U8 type);      ~LLHUDEffectResetSkeleton(); -    /*virtual*/ void packData(LLMessageSystem *mesgsys); -    /*virtual*/ void unpackData(LLMessageSystem *mesgsys, S32 blocknum); +    void render() override; +    void packData(LLMessageSystem *mesgsys) override; +    void unpackData(LLMessageSystem *mesgsys, S32 blocknum) override; -    void update(); +    void update() override;  private:      bool                        mResetAnimations;  }; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 9e8ed3bb43..8d5f94cdbb 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -2310,6 +2310,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes              }              if (request_skin)              { +                LLMutexLock lock(mMutex);                  mSkinRequests.push_back(UUIDBasedRequest(mesh_id));              }          } @@ -2460,7 +2461,7 @@ bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 dat          LLPointer<LLMeshSkinInfo> info = nullptr;          info = new LLMeshSkinInfo(mesh_id, skin); -        if (isAgentAvatarValid()) +        if (isAgentAvatarValid() && gAgentAvatarp->mInitFlags != 0)          { // joint numbers are consistent inside LLVOAvatar and animations, but inconsistent inside meshes,              // generate a map of mesh joint numbers to LLVOAvatar joint numbers              LLSkinningUtil::initJointNums(info, gAgentAvatarp); diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp index 79fee971a4..87bee62f09 100644 --- a/indra/newview/llreflectionmapmanager.cpp +++ b/indra/newview/llreflectionmapmanager.cpp @@ -223,13 +223,9 @@ void LLReflectionMapManager::update()          resume();      } -    static LLCachedControl<S32> sDetail(gSavedSettings, "RenderReflectionProbeDetail", -1); -    static LLCachedControl<S32> sLevel(gSavedSettings, "RenderReflectionProbeLevel", 3); -    static LLCachedControl<U32> sReflectionProbeCount(gSavedSettings, "RenderReflectionProbeCount", 256U); -    static LLCachedControl<S32> sProbeDynamicAllocation(gSavedSettings, "RenderReflectionProbeDynamicAllocation", -1);      static LLCachedControl<F32> sProbeUpdateSlowDown(gSavedSettings, "MPRenderProbeSlowDown", 0.05); -    bool realtime = sDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME; +    bool realtime = mRenderReflectionProbeDetail >= (S32)LLReflectionMapManager::DetailLevel::REALTIME;      if(sProbeUpdateSlowDown > 0.0)      { @@ -249,17 +245,17 @@ void LLReflectionMapManager::update()      {          U32 probe_count_temp = mDynamicProbeCount; -        if (sProbeDynamicAllocation > -1) +        if (mRenderReflectionProbeDynamicAllocation > -1)          { -            if (sLevel == 0) +            if (mRenderReflectionProbeLevel == 0)              {                  mDynamicProbeCount = 1;              } -            else if (sLevel == 1) +            else if (mRenderReflectionProbeLevel == 1)              {                  mDynamicProbeCount = (U32)mProbes.size();              } -            else if (sLevel == 2) +            else if (mRenderReflectionProbeLevel == 2)              {                  mDynamicProbeCount = llmax((U32)mProbes.size(), 128);              } @@ -268,20 +264,20 @@ void LLReflectionMapManager::update()                  mDynamicProbeCount = 256;              } -            if (sProbeDynamicAllocation > 1) +            if (mRenderReflectionProbeDynamicAllocation > 1)              {                  // Round mDynamicProbeCount to the nearest increment of 16 -                mDynamicProbeCount = ((mDynamicProbeCount + sProbeDynamicAllocation / 2) / sProbeDynamicAllocation) * 16; -                mDynamicProbeCount = llclamp(mDynamicProbeCount, 1, sReflectionProbeCount); +                mDynamicProbeCount = ((mDynamicProbeCount + mRenderReflectionProbeDynamicAllocation / 2) / mRenderReflectionProbeDynamicAllocation) * 16; +                mDynamicProbeCount = llclamp(mDynamicProbeCount, 1, mRenderReflectionProbeCount);              }              else              { -                mDynamicProbeCount = llclamp(mDynamicProbeCount + sProbeDynamicAllocation, 1, sReflectionProbeCount); +                mDynamicProbeCount = llclamp(mDynamicProbeCount + mRenderReflectionProbeDynamicAllocation, 1, mRenderReflectionProbeCount);              }          }          else          { -            mDynamicProbeCount = sReflectionProbeCount; +            mDynamicProbeCount = mRenderReflectionProbeCount;          }          mDynamicProbeCount = llmin(mDynamicProbeCount, LL_MAX_REFLECTION_PROBE_COUNT); @@ -494,7 +490,7 @@ void LLReflectionMapManager::update()              closestDynamic = probe;          } -        if (sLevel == 0) +        if (mRenderReflectionProbeLevel == 0)          {              // only update default probe when coverage is set to none              llassert(probe == mDefaultProbe); @@ -529,12 +525,16 @@ void LLReflectionMapManager::update()      if ((gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime) < sDefaultUpdatePeriod)      { -        if (sLevel == 0 && mDefaultProbe->mComplete) +//<<<<<<< HEAD +//      if (sLevel == 0 && mDefaultProbe->mComplete) +//======= +        if (mRenderReflectionProbeLevel == 0) +//>>>>>>> Second_Life_Release#17540023-2025.07          { // when probes are disabled don't update the default probe more often than the prescribed update period              oldestProbe = nullptr;          }      } -    else if (sLevel > 0) +    else if (mRenderReflectionProbeLevel > 0)      { // when probes are enabled don't update the default probe less often than the prescribed update period        oldestProbe = mDefaultProbe;      } @@ -570,6 +570,14 @@ void LLReflectionMapManager::update()      }  } +void LLReflectionMapManager::refreshSettings() +{ +    mRenderReflectionProbeDetail = gSavedSettings.getS32("RenderReflectionProbeDetail"); +    mRenderReflectionProbeLevel = gSavedSettings.getS32("RenderReflectionProbeLevel"); +    mRenderReflectionProbeCount = gSavedSettings.getU32("RenderReflectionProbeCount"); +    mRenderReflectionProbeDynamicAllocation = gSavedSettings.getS32("RenderReflectionProbeDynamicAllocation"); +} +  LLReflectionMap* LLReflectionMapManager::addProbe(LLSpatialGroup* group)  {      if (gGLManager.mGLVersion < 4.05f || !LLPipeline::sReflectionProbesEnabled) @@ -862,7 +870,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)      }      else      { -        //llassert(gSavedSettings.getS32("RenderReflectionProbeLevel") > 0); // should never update a probe that's not the default probe if reflection coverage is none +        llassert(mRenderReflectionProbeLevel > 0); // should never update a probe that's not the default probe if reflection coverage is none          probe->update(mRenderTarget.getWidth(), face);      } diff --git a/indra/newview/llreflectionmapmanager.h b/indra/newview/llreflectionmapmanager.h index c12a87cade..337c4ca7fa 100644 --- a/indra/newview/llreflectionmapmanager.h +++ b/indra/newview/llreflectionmapmanager.h @@ -110,6 +110,8 @@ public:      // maintain reflection probes      void update(); +    void refreshSettings(); +      // add a probe for the given spatial group      LLReflectionMap* addProbe(LLSpatialGroup* group = nullptr); @@ -251,6 +253,12 @@ private:      U32 mDynamicProbeCount; +    // cached settings from gSavedSettings +    S32 mRenderReflectionProbeDetail = -1; +    S32 mRenderReflectionProbeLevel = 3; +    U32 mRenderReflectionProbeCount = 256U; +    S32 mRenderReflectionProbeDynamicAllocation = -1; +      // resolution of reflection probes      U32 mProbeResolution = 128; diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp index 9e567e3262..6238a1145c 100644 --- a/indra/newview/llslurl.cpp +++ b/indra/newview/llslurl.cpp @@ -71,10 +71,10 @@ LLSLURL::LLSLURL(const std::string& slurl)      {          LLURI slurl_uri;          // parse the slurl as a uri -        if (slurl.find(':') == std::string::npos) +        if (slurl.find("://") == std::string::npos)          { -            // There may be no scheme ('secondlife:' etc.) passed in.  In that case -            // we want to normalize the slurl by putting the appropriate scheme +            // There may be no scheme ('secondlife://', 'https://' etc.) passed in. In that +            // case we want to normalize the slurl by putting the appropriate scheme              // in front of the slurl.  So, we grab the appropriate slurl base              // from the grid manager which may be http://slurl.com/secondlife/ for maingrid, or              // https://<hostname>/region/ for Standalone grid (the word region, not the region name) diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 8d010553a0..eca5ba82ac 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -61,6 +61,7 @@  #include "lllocationhistory.h"  #include "llgltfmateriallist.h"  #include "llimageworker.h" +#include "llregex.h"  #include "llloginflags.h"  #include "llmd5.h" @@ -349,13 +350,11 @@ void pump_idle_startup_network(void)  {      // while there are message to process:      //     process one then call display_startup() -    S32 num_messages = 0;      {          LockMessageChecker lmc(gMessageSystem);          while (lmc.checkAllMessages(gFrameCount, gServicePump))          {              display_startup(); -            ++num_messages;          }          lmc.processAcks();      } @@ -406,6 +405,7 @@ bool idle_startup()          LL_WARNS_ONCE() << "gViewerWindow is not initialized" << LL_ENDL;          return false; // No world yet      } +    LL_PROFILE_ZONE_SCOPED;      const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay");      static LLTimer timeout; @@ -2588,6 +2588,27 @@ void release_notes_coro(const std::string url)      LLWeb::loadURLInternal(url);  } +void validate_release_notes_coro(const std::string url) +{ +    LLVersionInfo& versionInfo(LLVersionInfo::instance()); +    const boost::regex version_regex(R"(\b\d+\.\d+\.\d+\.\d+\b)"); + +    if (url.find(versionInfo.getVersion()) == std::string::npos // has no our build version +        && ll_regex_search(url, version_regex)) // has any version +    { +        LL_INFOS() << "Received release notes url \"" << url << "\" wwith mismatching build, falling back to locally generated url" << LL_ENDL; +        // Updater only provides notes for a most recent version, if it is not +        // the current one, fall back to the hardcoded URL. +        LLSD info(LLAppViewer::instance()->getViewerInfo()); +        std::string alt_url = info["VIEWER_RELEASE_NOTES_URL"].asString(); +        release_notes_coro(alt_url); +    } +    else +    { +        release_notes_coro(url); +    } +} +  /**  * Check if user is running a new version of the viewer.  * Display the Release Notes if it's not overriden by the "UpdaterShowReleaseNotes" setting. @@ -2621,7 +2642,7 @@ void show_release_notes_if_required()                  "showrelnotes",                  [](const LLSD& url) {                      LLCoros::instance().launch("releaseNotesCoro", -                    boost::bind(&release_notes_coro, url.asString())); +                    boost::bind(&validate_release_notes_coro, url.asString()));                  return false;              });          } diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 8793541e80..9e4abd632a 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -167,7 +167,8 @@ bool LLStatusBar::postBuild()      getChild<LLUICtrl>("buyL")->setCommitCallback(          boost::bind(&LLStatusBar::onClickBuyCurrency, this)); -    getChild<LLUICtrl>("goShop")->setCommitCallback(boost::bind(&LLWeb::loadURL, gSavedSettings.getString("MarketplaceURL"), LLStringUtil::null, LLStringUtil::null)); +    getChild<LLUICtrl>("goShop")->setCommitCallback( +        boost::bind(&LLStatusBar::onClickShop, this));      mBoxBalance = getChild<LLTextBox>("balance");      mBoxBalance->setClickedCallback(&LLStatusBar::onClickRefreshBalance, this); @@ -548,6 +549,11 @@ void LLStatusBar::onClickBuyCurrency()      LLFirstUse::receiveLindens(false);  } +void LLStatusBar::onClickShop() +{ +    LLFloaterReg::toggleInstanceOrBringToFront("marketplace"); +} +  void LLStatusBar::onMouseEnterPresetsCamera()  {      LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder"); diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index f1225a22f8..e54ccfe736 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -101,6 +101,7 @@ public:  private:      void onClickBuyCurrency(); +    void onClickShop();      void onVolumeChanged(const LLSD& newvalue);      void onVoiceChanged(const LLSD& newvalue);      void onObscureBalanceChanged(const LLSD& newvalue); diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 2027e958d5..5507ef517a 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -186,6 +186,7 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(      mOnUpdateImageStatsCallback(NULL),      mBakeTextureEnabled(false),      mLocalTextureEnabled(false), +    mNoCopyTextureSelected(false),      mInventoryPickType(pick_type)  {      setTentative(tentative); @@ -263,6 +264,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti              if (set_selection)              { +                // This is going to cause a callback                  mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);              }          } @@ -597,7 +599,6 @@ bool LLFloaterTexturePicker::postBuild()          refreshInventoryFilter();          mInventoryPanel->setFilterPermMask(mImmediateFilterPermMask); -        mInventoryPanel->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2));          mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);          // Disable auto selecting first filtered item because it takes away @@ -616,8 +617,25 @@ bool LLFloaterTexturePicker::postBuild()          if(!mImageAssetID.isNull() || mInventoryPickType == PICK_MATERIAL)          { -            mInventoryPanel->setSelection(findItemID(mImageAssetID, false), TAKE_FOCUS_NO); +            LLViewerInventoryItem* itemp = findInvItem(mImageAssetID, false); +            LLUUID item_id; +            if (itemp) +            { +                item_id = itemp->getUUID(); +            } + +            mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO); + +            if (item_id.notNull() && itemp) +            { +                if (!itemp->getPermissions().allowCopyBy(gAgent.getID())) +                { +                    mNoCopyTextureSelected = true; +                } +            }          } +        // Don't call before setSelection, setSelection will mark view as dirty +        mInventoryPanel->setSelectCallback(boost::bind(&LLFloaterTexturePicker::onSelectionChange, this, _1, _2));      }      childSetAction("l_add_btn", LLFloaterTexturePicker::onBtnAdd, this); @@ -809,12 +827,12 @@ void LLFloaterTexturePicker::draw()      }  } -const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library) +LLViewerInventoryItem* LLFloaterTexturePicker::findInvItem(const LLUUID& asset_id, bool copyable_only, bool ignore_library) const  {      if (asset_id.isNull())      {          // null asset id means, no material or texture assigned -        return LLUUID::null; +        return nullptr;      }      LLUUID loockup_id = asset_id; @@ -854,30 +872,41 @@ const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool co          // search for copyable version first          for (S32 i = 0; i < items.size(); i++)          { -            LLInventoryItem* itemp = items[i]; +            LLViewerInventoryItem* itemp = items[i];              LLPermissions item_permissions = itemp->getPermissions();              if (item_permissions.allowCopyBy(gAgent.getID(), gAgent.getGroupID()))              { -                if(!ignore_library || !gInventory.isObjectDescendentOf(itemp->getUUID(),gInventory.getLibraryRootFolderID())) +                if (!ignore_library || !gInventory.isObjectDescendentOf(itemp->getUUID(), gInventory.getLibraryRootFolderID()))                  { -                    return itemp->getUUID(); +                    return itemp;                  }              }          }          // otherwise just return first instance, unless copyable requested          if (copyable_only)          { -            return LLUUID::null; +            return nullptr;          }          else          { -            if(!ignore_library || !gInventory.isObjectDescendentOf(items[0]->getUUID(),gInventory.getLibraryRootFolderID())) +            if (!ignore_library || !gInventory.isObjectDescendentOf(items[0]->getUUID(), gInventory.getLibraryRootFolderID()))              { -                return items[0]->getUUID(); +                return items[0];              }          }      } +    return nullptr; +} + +const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library) const +{ +    LLViewerInventoryItem* itemp = findInvItem(asset_id, copyable_only, ignore_library); +    if (itemp) +    { +        return itemp->getUUID(); +    } +      return LLUUID::null;  } diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index 79957431b7..467b8d1091 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -340,7 +340,7 @@ public:      void setImageID(const LLUUID& image_asset_id, bool set_selection = true);      bool updateImageStats(); // true if within limits      const LLUUID&   getAssetID() { return mImageAssetID; } -    const LLUUID&   findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false); +    const LLUUID&   findItemID(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false) const;      void            setCanApplyImmediately(bool b);      void            setActive(bool active); @@ -397,6 +397,7 @@ protected:      void refreshLocalList();      void refreshInventoryFilter();      void setImageIDFromItem(const LLInventoryItem* itemp, bool set_selection = true); +    LLViewerInventoryItem* findInvItem(const LLUUID& asset_id, bool copyable_only, bool ignore_library = false) const;      LLPointer<LLViewerTexture> mTexturep;      LLPointer<LLFetchedGLTFMaterial> mGLTFMaterial; diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index cc187a1f98..93b5806acf 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -49,6 +49,7 @@  #include "llviewerregion.h"  #include "llviewerstats.h"  #include "llviewerstatsrecorder.h" +#include "llviewerthrottle.h"  #include "llviewerassetstats.h"  #include "llworld.h"  #include "llsdparam.h" @@ -2434,7 +2435,7 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, bool threaded, bool qa_mod        mOriginFetchSource(LLTextureFetch::FROM_ALL),        mTextureInfoMainThread(false)  { -    mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS"); +    mMaxBandwidth = LLViewerThrottle::getMaxBandwidthKbps();      mTextureInfo.setLogging(true);      LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp()); @@ -2953,11 +2954,10 @@ void LLTextureFetch::commonUpdate()  size_t LLTextureFetch::update(F32 max_time_ms)  {      LL_PROFILE_ZONE_SCOPED; -    static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS", 3000.0);      {          mNetworkQueueMutex.lock();                                      // +Mfnq -        mMaxBandwidth = band_width(); +        mMaxBandwidth = LLViewerThrottle::getMaxBandwidthKbps();          add(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED, mHTTPTextureBits);          mHTTPTextureBits = (U32Bits)0; diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 8560a01c4b..8cbede8303 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -49,6 +49,7 @@  #include "llviewerobjectlist.h"  #include "llviewertexture.h"  #include "llviewertexturelist.h" +#include "llviewerthrottle.h"  #include "llviewerwindow.h"  #include "llwindow.h"  #include "llvovolume.h" @@ -633,7 +634,7 @@ void LLGLTexMemBar::draw()                                               LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &x_right);      F32Kilobits bandwidth(LLAppViewer::getTextureFetch()->getTextureBandwidth()); -    F32Kilobits max_bandwidth(gSavedSettings.getF32("ThrottleBandwidthKBPS")); +    F32Kilobits max_bandwidth(LLViewerThrottle::getMaxBandwidthKbps());      color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color;      color[VALPHA] = text_color[VALPHA];      text = llformat("BW:%.0f/%.0f",bandwidth.value(), max_bandwidth.value()); diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index d915f11e74..553c8d9b00 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -157,9 +157,9 @@ bool LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVecto      // update pixel meter ratio using default fov, not modified one      mPixelMeterRatio = (F32)(getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5f)));      // update screen pixel area +    mScreenPixelArea =(S32)((F32)getViewHeightInPixels() * ((F32)getViewHeightInPixels() * getAspect()));      return true; -    mScreenPixelArea =(S32)((F32)getViewHeightInPixels() * ((F32)getViewHeightInPixels() * getAspect()));  }  const LLMatrix4 &LLViewerCamera::getProjection() const diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 9043a5a89e..6a3be8c882 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -448,6 +448,7 @@ static bool handleRenderDynamicLODChanged(const LLSD& newvalue)  static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)  { +    gPipeline.mReflectionMapManager.refreshSettings();      if (gPipeline.isInit())      {          LLPipeline::refreshCachedSettings(); @@ -460,6 +461,12 @@ static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)      return true;  } +static bool handleReflectionProbeCountChanged(const LLSD& newvalue) +{ +    gPipeline.mReflectionMapManager.refreshSettings(); +    return true; +} +  #if LL_DARWIN  static bool handleAppleUseMultGLChanged(const LLSD& newvalue)  { @@ -837,6 +844,7 @@ void settings_setup_listeners()      setting_setup_signal_listener(gSavedSettings, "RenderResolutionDivisor", handleRenderResolutionDivisorChanged);      setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeLevel", handleReflectionProbeDetailChanged);      setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeDetail", handleReflectionProbeDetailChanged); +    setting_setup_signal_listener(gSavedSettings, "RenderReflectionProbeCount", handleReflectionProbeCountChanged);      setting_setup_signal_listener(gSavedSettings, "RenderReflectionsEnabled", handleReflectionProbeDetailChanged);  #if LL_DARWIN      setting_setup_signal_listener(gSavedSettings, "RenderAppleUseMultGL", handleAppleUseMultGLChanged); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index fed6cd11db..b65ad3b3ec 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -21,6 +21,7 @@   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA   *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ @@ -99,6 +100,7 @@  #include "llfloaterlinkreplace.h"  #include "llfloaterloadprefpreset.h"  #include "llfloatermap.h" +#include "llfloatermarketplace.h"  #include "llfloatermarketplacelistings.h"  #include "llfloatermediasettings.h"  #include "llfloatermemleak.h" @@ -426,6 +428,7 @@ void LLViewerFloaterReg::registerFloaters()      LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>);      LLFloaterReg::add("media_settings", "floater_media_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMediaSettings>); +    LLFloaterReg::add("marketplace", "floater_marketplace.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplace>);      LLFloaterReg::add("marketplace_listings", "floater_marketplace_listings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplaceListings>);      LLFloaterReg::add("marketplace_validation", "floater_marketplace_validation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMarketplaceValidation>);      LLFloaterReg::add("message_critical", "floater_critical.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTOS>); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index ce8ce791b9..09bb4a35ad 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -1259,35 +1259,46 @@ void LLViewerMedia::getOpenIDCookieCoro(std::string url)      {          LLAppViewer::instance()->postToMainCoro([=]()              { -                LLMediaCtrl* media_instance = LLFloaterReg::getInstance("destinations")->getChild<LLMediaCtrl>("destination_guide_contents"); -                if (media_instance) +                std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart); +                std::string cookie_name = ""; +                std::string cookie_value = ""; +                std::string cookie_path = ""; +                bool httponly = true; +                bool secure = true; + +                LLViewerMedia* inst = getInstance(); +                if (inst->parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure))                  { -                    LLViewerMedia* inst = getInstance(); -                    std::string cookie_host = authority.substr(hostStart, hostEnd - hostStart); -                    std::string cookie_name = ""; -                    std::string cookie_value = ""; -                    std::string cookie_path = ""; -                    bool httponly = true; -                    bool secure = true; -                    if (inst->parseRawCookie(inst->mOpenIDCookie, cookie_name, cookie_value, cookie_path, httponly, secure) && -                        media_instance->getMediaPlugin()) +                    // MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the +                    // url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked. +                    // For now, we use the URL for the OpenID POST request since it will have the same authority +                    // as the domain field. +                    // (Feels like there must be a less dirty way to construct a URL from component LLURL parts) +                    // MAINT-6392 - Rider: Do not change, however, the original URI requested, since it is used further +                    // down. +                    std::string cefUrl(std::string(inst->mOpenIDURL.mURI) + "://" + std::string(inst->mOpenIDURL.mAuthority)); + +                    // list of floater names and webbrowser therein to set the cookie that arrived via login into +                    struct MediaCookieInstance { +                        std::string floater_name; +                        std::string browser_name; +                    }; +                    struct MediaCookieInstance media_cookie_instances[] = { +                        {"search", "search_contents" }, +                        {"marketplace", "marketplace_contents" }, +                        {"destinations", "destination_guide_contents" }, +                    }; +                    for (MediaCookieInstance mci : media_cookie_instances)                      { -                        // MAINT-5711 - inexplicably, the CEF setCookie function will no longer set the cookie if the -                        // url and domain are not the same. This used to be my.sl.com and id.sl.com respectively and worked. -                        // For now, we use the URL for the OpenID POST request since it will have the same authority -                        // as the domain field. -                        // (Feels like there must be a less dirty way to construct a URL from component LLURL parts) -                        // MAINT-6392 - Rider: Do not change, however, the original URI requested, since it is used further -                        // down. -                        std::string cefUrl(std::string(inst->mOpenIDURL.mURI) + "://" + std::string(inst->mOpenIDURL.mAuthority)); - -                        media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host, -                            cookie_path, httponly, secure); - -                        // Now that we have parsed the raw cookie, we must store it so that each new media instance -                        // can also get a copy and faciliate logging into internal SL sites. -                        media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value, -                            cookie_host, cookie_path, httponly, secure); +                        LLMediaCtrl* media_instance = LLFloaterReg::getInstance(mci.floater_name)->getChild<LLMediaCtrl>(mci.browser_name); +                        if (media_instance && media_instance->getMediaPlugin()) +                        { +                            media_instance->getMediaPlugin()->setCookie(cefUrl, cookie_name, cookie_value, cookie_host, +                                cookie_path, httponly, secure); + +                            media_instance->getMediaPlugin()->storeOpenIDCookie(cefUrl, cookie_name, cookie_value, +                                cookie_host, cookie_path, httponly, secure); +                        }                      }                  }              }); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 63a2a9a303..452a2cec50 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -4367,13 +4367,6 @@ void set_god_level(U8 god_level)      // changing god-level can affect which menus we see      show_debug_menus(); - -    // changing god-level can invalidate search results -    LLFloaterSearch *search = dynamic_cast<LLFloaterSearch*>(LLFloaterReg::getInstance("search")); -    if (search) -    { -        search->godLevelChanged(god_level); -    }  }  #ifdef TOGGLE_HACKED_GODLIKE_VIEWER @@ -6532,7 +6525,7 @@ void handle_look_at_selection(const LLSD& param)      }  } -void handle_zoom_to_object(const LLUUID& object_id) +bool handle_zoom_to_object(const LLUUID& object_id)  {      const F32 PADDING_FACTOR = 2.f; @@ -6550,12 +6543,14 @@ void handle_zoom_to_object(const LLUUID& object_id)          obj_to_cam.normVec(); -            LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent()); +        LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent()); -            gAgentCamera.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance), +        gAgentCamera.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance),                                              object_center_global,                                              object_id ); +        return true;      } +    return false;  }  void handle_teleport_to_object(LLUUID object_id) diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 68ba740f67..6c9d56cffb 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -73,7 +73,7 @@ void handle_buy();  void handle_take(bool take_separate = false);  void handle_take_copy();  void handle_look_at_selection(const LLSD& param); -void handle_zoom_to_object(const LLUUID& object_id); +bool handle_zoom_to_object(const LLUUID& object_id);  void handle_teleport_to_object(LLUUID object_id);  void handle_object_return();  void handle_object_delete(); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 57dd0d9581..02171acaac 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3384,6 +3384,17 @@ void send_agent_update(bool force_send, bool send_reliable)      msg->addVector3Fast(_PREHASH_CameraUpAxis, LLViewerCamera::getInstance()->getUpAxis());      static F32 last_draw_disatance_step = 1024; +    F32 memory_limited_draw_distance = gAgentCamera.mDrawDistance; + +    if (LLViewerTexture::sDesiredDiscardBias > 2.f && LLViewerTexture::isSystemMemoryLow()) +    { +        // If we are low on memory, reduce requested draw distance +        // Discard's bias is clamped to 4 so we need to check 2 to 4 range +        // Factor is intended to go from 1.0 to 2.0 +        F32 factor = 1.f + (LLViewerTexture::sDesiredDiscardBias - 2.f) / 2.f; +        memory_limited_draw_distance = llmax(gAgentCamera.mDrawDistance / factor, gAgentCamera.mDrawDistance / 2.f); +    } +      if (tp_state == LLAgent::TELEPORT_ARRIVING || LLStartUp::getStartupState() < STATE_MISC)      {          // Inform interest list, prioritize closer area. @@ -3392,25 +3403,25 @@ void send_agent_update(bool force_send, bool send_reliable)          // closer ones.          // Todo: revise and remove once server gets distance sorting.          last_draw_disatance_step = llmax((F32)(gAgentCamera.mDrawDistance / 2.f), 50.f); +        last_draw_disatance_step = llmin(last_draw_disatance_step, memory_limited_draw_distance);          msg->addF32Fast(_PREHASH_Far, last_draw_disatance_step);      } -    else if (last_draw_disatance_step < gAgentCamera.mDrawDistance) +    else if (last_draw_disatance_step < memory_limited_draw_distance)      {          static LLFrameTimer last_step_time;          if (last_step_time.getElapsedTimeF32() > 1.f)          {              // gradually increase draw distance -            // Idealy this should be not per second, but based on how loaded -            // mesh thread is, but hopefully this is temporary.              last_step_time.reset(); -            F32 step = gAgentCamera.mDrawDistance * 0.1f; -            last_draw_disatance_step = llmin(last_draw_disatance_step + step, gAgentCamera.mDrawDistance); +            F32 step = memory_limited_draw_distance * 0.1f; +            last_draw_disatance_step = llmin(last_draw_disatance_step + step, memory_limited_draw_distance);          }          msg->addF32Fast(_PREHASH_Far, last_draw_disatance_step);      }      else      { -        msg->addF32Fast(_PREHASH_Far, gAgentCamera.mDrawDistance); +        last_draw_disatance_step = memory_limited_draw_distance; +        msg->addF32Fast(_PREHASH_Far, memory_limited_draw_distance);      }      msg->addU32Fast(_PREHASH_ControlFlags, control_flags); diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp index b8c9594aa7..da2ca0aca4 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -450,7 +450,7 @@ std::string LLGridManager::getGridLabel(const std::string& grid)  {      std::string grid_label;      std::string grid_name = getGrid(grid); -    if (!grid.empty()) +    if (!grid_name.empty())      {          grid_label = mGridList[grid_name][GRID_LABEL_VALUE].asString();      } @@ -466,7 +466,7 @@ std::string LLGridManager::getGridId(const std::string& grid)  {      std::string grid_id;      std::string grid_name = getGrid(grid); -    if (!grid.empty()) +    if (!grid_name.empty())      {          grid_id = mGridList[grid_name][GRID_ID_VALUE].asString();      } diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 43cb7d8a14..3e9f67bf29 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -551,7 +551,11 @@ void LLViewerShaderMgr::setShaders()              gSavedSettings.setString("RenderShaderCacheVersion", current_cache_version.asString());          } -        initShaderCache(shader_cache_enabled, old_cache_version, current_cache_version); +        initShaderCache( +            shader_cache_enabled, +            old_cache_version, +            current_cache_version, +            LLAppViewer::instance()->isSecondInstance());      }      static LLCachedControl<U32> max_texture_index(gSavedSettings, "RenderMaxTextureIndex", 16); @@ -709,7 +713,10 @@ void LLViewerShaderMgr::setShaders()      loaded = loaded && loadShadersDeferred();      llassert(loaded); -    persistShaderCacheMetadata(); +    if (!LLAppViewer::instance()->isSecondInstance()) +    { +        persistShaderCacheMetadata(); +    }      if (gViewerWindow)      { diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 5ba0a86e68..7a25fb03a5 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -524,12 +524,19 @@ void LLViewerTexture::updateClass()      bool is_low = is_sys_low || over_pct > 0.f;      static bool was_low = false; -    static bool was_sys_low = false;      if (is_low && !was_low)      { -        // slam to 1.5 bias the moment we hit low memory (discards off screen textures immediately) -        sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f); +        if (is_sys_low) +        { +            // Not having system memory is more serious, so discard harder +            sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f * getSystemMemoryBudgetFactor()); +        } +        else +        { +            // Slam to 1.5 bias the moment we hit low memory (discards off screen textures immediately) +            sDesiredDiscardBias = llmax(sDesiredDiscardBias, 1.5f); +        }          if (is_sys_low || over_pct > 2.f)          { // if we're low on system memory, emergency purge off screen textures to avoid a death spiral @@ -542,7 +549,6 @@ void LLViewerTexture::updateClass()      }      was_low = is_low; -    was_sys_low = is_sys_low;      if (is_low)      { @@ -561,8 +567,13 @@ void LLViewerTexture::updateClass()          sEvaluationTimer.reset();          // lower discard bias over time when at least 10% of budget is free -        const F32 FREE_PERCENTAGE_TRESHOLD = -0.1f; -        if (sDesiredDiscardBias > 1.f && over_pct < FREE_PERCENTAGE_TRESHOLD) +        constexpr F32 FREE_PERCENTAGE_TRESHOLD = -0.1f; +        constexpr U32 FREE_SYS_MEM_TRESHOLD = 100; +        static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512); +        const S32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory() + FREE_SYS_MEM_TRESHOLD); +        if (sDesiredDiscardBias > 1.f +            && over_pct < FREE_PERCENTAGE_TRESHOLD +            && getFreeSystemMemory() > MIN_FREE_MAIN_MEMORY)          {              static LLCachedControl<F32> high_mem_discard_decrement(gSavedSettings, "RenderHighMemMinDiscardDecrement", .1f); @@ -629,24 +640,42 @@ void LLViewerTexture::updateClass()  }  //static -bool LLViewerTexture::isSystemMemoryLow() +U32Megabytes LLViewerTexture::getFreeSystemMemory()  {      static LLFrameTimer timer;      static U32Megabytes physical_res = U32Megabytes(U32_MAX); -    static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512); -    const U32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory); -      if (timer.getElapsedTimeF32() < MEMORY_CHECK_WAIT_TIME) //call this once per second.      { -        return physical_res < MIN_FREE_MAIN_MEMORY; +        return physical_res;      }      timer.reset();      LLMemory::updateMemoryInfo();      physical_res = LLMemory::getAvailableMemKB(); -    return physical_res < MIN_FREE_MAIN_MEMORY; +    return physical_res; +} + +//static +bool LLViewerTexture::isSystemMemoryLow() +{ +    static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512); +    const U32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory); +    return getFreeSystemMemory() < MIN_FREE_MAIN_MEMORY; +} + +F32 LLViewerTexture::getSystemMemoryBudgetFactor() +{ +    static LLCachedControl<U32> min_free_main_memory(gSavedSettings, "RenderMinFreeMainMemoryThreshold", 512); +    const S32Megabytes MIN_FREE_MAIN_MEMORY(min_free_main_memory); +    S32 free_budget = (S32Megabytes)getFreeSystemMemory() - MIN_FREE_MAIN_MEMORY; +    if (free_budget < 0) +    { +        // Result should range from 1 (0 free budget) to 2 (-512 free budget) +        return 1.f - free_budget / MIN_FREE_MAIN_MEMORY; +    } +    return 1.f;  }  //end of static functions diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index f9311d85cb..d32c302d8e 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -115,6 +115,7 @@ public:      static void initClass();      static void updateClass();      static bool isSystemMemoryLow(); +    static F32 getSystemMemoryBudgetFactor();      LLViewerTexture(bool usemipmaps = true);      LLViewerTexture(const LLUUID& id, bool usemipmaps) ; @@ -189,6 +190,8 @@ private:      friend class LLBumpImageList;      friend class LLUIImageList; +    static U32Megabytes getFreeSystemMemory(); +  protected:      friend class LLViewerTextureList;      LLUUID mID; diff --git a/indra/newview/llviewerthrottle.cpp b/indra/newview/llviewerthrottle.cpp index 8d935e4243..3ccfbea6e2 100644 --- a/indra/newview/llviewerthrottle.cpp +++ b/indra/newview/llviewerthrottle.cpp @@ -225,7 +225,7 @@ void LLViewerThrottle::setMaxBandwidth(F32 kbits_per_second, bool from_event)  void LLViewerThrottle::load()  { -    mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS")*1024; +    mMaxBandwidth = getMaxBandwidthKbps() * 1024;      resetDynamicThrottle();      mCurrent.dump();  } @@ -242,6 +242,15 @@ void LLViewerThrottle::sendToSim() const      mCurrent.sendToSim();  } +F32 LLViewerThrottle::getMaxBandwidthKbps() +{ +    constexpr F32 MIN_BANDWIDTH = 100.0f; // 100 Kbps +    constexpr F32 MAX_BANDWIDTH = 10000.0f; // 10 Mbps + +    static LLCachedControl<F32> bandwidth(gSavedSettings, "ThrottleBandwidthKBPS", 3000.0); +    return llclamp(bandwidth(), MIN_BANDWIDTH, MAX_BANDWIDTH); +} +  LLViewerThrottleGroup LLViewerThrottle::getThrottleGroup(const F32 bandwidth_kbps)  { diff --git a/indra/newview/llviewerthrottle.h b/indra/newview/llviewerthrottle.h index 9973c88549..ef898a97d7 100644 --- a/indra/newview/llviewerthrottle.h +++ b/indra/newview/llviewerthrottle.h @@ -64,6 +64,7 @@ public:      void save() const;      void sendToSim() const; +    static F32 getMaxBandwidthKbps();      F32 getMaxBandwidth()const          { return mMaxBandwidth; }      F32 getCurrentBandwidth() const     { return mCurrentBandwidth; } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 35f33e64cb..47fb658d15 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -2311,6 +2311,18 @@ void LLViewerWindow::initWorldUI()              url = LLWeb::expandURLSubstitutions(url, LLSD());              avatar_welcome_pack->navigateTo(url, HTTP_CONTENT_TEXT_HTML);          } +        LLMediaCtrl* search = LLFloaterReg::getInstance("search")->findChild<LLMediaCtrl>("search_contents"); +        if (search) +        { +            search->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); +        } +        LLMediaCtrl* marketplace = LLFloaterReg::getInstance("marketplace")->getChild<LLMediaCtrl>("marketplace_contents"); +        if (marketplace) +        { +            marketplace->setErrorPageURL(gSavedSettings.getString("GenericErrorPageURL")); +            std::string url = gSavedSettings.getString("MarketplaceURL"); +            marketplace->navigateTo(url, HTTP_CONTENT_TEXT_HTML); +        }      }  } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index ab07afe23e..910f711a9d 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -4797,14 +4797,6 @@ bool LLVOAvatar::updateCharacter(LLAgent &agent)      }      bool visible = isVisible(); -    bool is_control_avatar = isControlAvatar(); // capture state to simplify tracing -    bool is_attachment = false; - -    if (is_control_avatar) -    { -        LLControlAvatar *cav = dynamic_cast<LLControlAvatar*>(this); -        is_attachment = cav && cav->mRootVolp && cav->mRootVolp->isAttachment(); // For attached animated objects -    }      // For fading out the names above heads, only let the timer      // run if we're visible. diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 501828eee8..ac73c2def6 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -486,14 +486,23 @@ void LLVOCacheEntry::updateDebugSettings()      //min radius: all objects within this radius remain loaded in memory      static LLCachedControl<F32> min_radius(gSavedSettings,"SceneLoadMinRadius");      static const F32 MIN_RADIUS = 1.0f; -    const F32 draw_radius = gAgentCamera.mDrawDistance; + +    F32 draw_radius = gAgentCamera.mDrawDistance; +    if (LLViewerTexture::sDesiredDiscardBias > 2.f && LLViewerTexture::isSystemMemoryLow()) +    { +        // Discard's bias maximum is 4 so we need to check 2 to 4 range +        // Factor is intended to go from 1.0 to 2.0 +        F32 factor = 1.f + (LLViewerTexture::sDesiredDiscardBias - 2.f) / 2.f; +        // For safety cap reduction at 50%, we don't want to go below half of draw distance +        draw_radius = llmax(draw_radius / factor, draw_radius / 2.f); +    }      const F32 clamped_min_radius = llclamp((F32) min_radius, MIN_RADIUS, draw_radius); // [1, mDrawDistance]      sNearRadius = MIN_RADIUS + ((clamped_min_radius - MIN_RADIUS) * adjust_factor);      // a percentage of draw distance beyond which all objects outside of view frustum will be unloaded, regardless of pixel threshold      static LLCachedControl<F32> rear_max_radius_frac(gSavedSettings,"SceneLoadRearMaxRadiusFraction");      const F32 min_radius_plus_one = sNearRadius + 1.f; -    const F32 max_radius = rear_max_radius_frac * gAgentCamera.mDrawDistance; +    const F32 max_radius = rear_max_radius_frac * draw_radius;      const F32 clamped_max_radius = llclamp(max_radius, min_radius_plus_one, draw_radius); // [sNearRadius, mDrawDistance]      sRearFarRadius = min_radius_plus_one + ((clamped_max_radius - min_radius_plus_one) * adjust_factor); diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index 04cee00c12..30f899877a 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -2308,7 +2308,6 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection)          return;      } -    bool iceCompleted = false;      LLSD body;      if (!connection->mIceCandidates.empty() || connection->mIceCompleted)      { @@ -2347,7 +2346,6 @@ void LLVoiceWebRTCConnection::processIceUpdatesCoro(connectionPtr_t connection)              LLSD body_candidate;              body_candidate["completed"] = true;              body["candidate"]           = body_candidate; -            iceCompleted                = connection->mIceCompleted;              connection->mIceCompleted   = false;          } @@ -2980,7 +2978,6 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b              return;          }          boost::json::object voice_data = voice_data_parsed.as_object(); -        bool new_participant = false;          boost::json::object mute;          boost::json::object user_gain;          for (auto &participant_elem : voice_data) @@ -3033,7 +3030,6 @@ void LLVoiceWebRTCConnection::OnDataReceivedImpl(const std::string &data, bool b                  }              } -            new_participant |= joined;              if (!participant && joined && (primary || !isSpatial()))              {                  participant = LLWebRTCVoiceClient::getInstance()->addParticipantByID(mChannelID, agent_id, mRegionID); diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 5fb22184c3..cc593fe7b4 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -994,8 +994,11 @@ void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu          LLUUID linked_id = item->getLinkedUUID();          LLViewerInventoryItem* linked_item = gInventory.getItem(linked_id); -        can_favorite |= !linked_item->getIsFavorite(); -        can_unfavorite |= linked_item->getIsFavorite(); +        if (linked_item) +        { +            can_favorite |= !linked_item->getIsFavorite(); +            can_unfavorite |= linked_item->getIsFavorite(); +        }          if (is_worn)          { diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index fb04722864..e993ca25b7 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -430,6 +430,8 @@ void LLPipeline::init()      sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");      sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles"); +    mReflectionMapManager.refreshSettings(); +      mInitialized = true;      LOG_GLERROR("LLPipeline::init()"); diff --git a/indra/newview/skins/default/xui/da/floater_search.xml b/indra/newview/skins/default/xui/da/floater_search.xml deleted file mode 100644 index 80a30b1aa1..0000000000 --- a/indra/newview/skins/default/xui/da/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title="FIND"> -	<floater.string name="loading_text"> -		Henter... -	</floater.string> -	<floater.string name="done_text"> -		Færdig -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Gentag søgning med "God level" -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/de/floater_search.xml b/indra/newview/skins/default/xui/de/floater_search.xml deleted file mode 100644 index bd39bf2bce..0000000000 --- a/indra/newview/skins/default/xui/de/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Wird geladen... -	</floater.string> -	<floater.string name="done_text"> -		Fertig -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Suche wiederholen, um aktuellen Gott-Level zu berücksichtigen -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_marketplace.xml b/indra/newview/skins/default/xui/en/floater_marketplace.xml new file mode 100644 index 0000000000..2299e02c63 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_marketplace.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater + positioning="cascading" + legacy_header_height="225" + can_minimize="true" + can_close="true" + can_resize="true" + min_height="800" + min_width="800" + height="800" + layout="topleft" + name="Marketplace" + single_instance="true" + help_topic="marketplace" + save_rect="true" + save_visibility="true" + title="MARKETPLACE" + width="800"> +    <web_browser +      top="25" +      height="775" +      width="800" +      follows="all" +      name="marketplace_contents" +      trusted_content="true"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index fc1e32915a..76a486e211 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -1,18 +1,26 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater -  positioning="cascading" -  legacy_header_height="18" -  can_resize="true" -  height="775" -  layout="topleft" -  min_height="400" -  min_width="500" -  name="floater_search" -  help_topic="floater_search" -  save_rect="true" -  save_visibility="true" -  title="" -  initial_mime_type="text/html" -  width="780" -  tab_stop="true" -  filename="floater_web_content.xml"/> + positioning="cascading" + legacy_header_height="225" + can_minimize="true" + can_close="true" + can_resize="true" + min_height="800" + min_width="800" + height="800" + layout="topleft" + name="Search" + single_instance="true" + help_topic="search" + save_rect="true" + save_visibility="true" + title="SEARCH" + width="800"> +    <web_browser +      top="25" +      height="775" +      width="800" +      follows="all" +      name="search_contents" +      trusted_content="true"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_settings_debug.xml b/indra/newview/skins/default/xui/en/floater_settings_debug.xml index a93be6a18d..c40ae3ea06 100644 --- a/indra/newview/skins/default/xui/en/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/en/floater_settings_debug.xml @@ -66,6 +66,7 @@     visible="false"     name="comment_text"     follows="left|top" +   max_length="1024"     width="240"     top_delta="20"     word_wrap="true" /> diff --git a/indra/newview/skins/default/xui/en/menu_object_icon.xml b/indra/newview/skins/default/xui/en/menu_object_icon.xml index f3e520700b..d43ce26e56 100644 --- a/indra/newview/skins/default/xui/en/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/en/menu_object_icon.xml @@ -41,6 +41,17 @@      <menu_item_separator       layout="topleft" />      <menu_item_call +     label="Zoom in" +     layout="topleft" +     name="zoom_in"> +        <menu_item_call.on_click +         function="ObjectIcon.Action" +         parameter="obj_zoom_in" /> +        <menu_item_call.on_enable +         function="ObjectIcon.Visible" +         parameter="obj_zoom_in" /> +    </menu_item_call> +    <menu_item_call       label="Show on Map"       layout="topleft"       name="show_on_map"> diff --git a/indra/newview/skins/default/xui/en/menu_url_objectim.xml b/indra/newview/skins/default/xui/en/menu_url_objectim.xml index 1874c01f8d..fb6081e1fb 100644 --- a/indra/newview/skins/default/xui/en/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/en/menu_url_objectim.xml @@ -26,6 +26,13 @@      <menu_item_separator       layout="topleft" />      <menu_item_call +     label="Zoom in" +     layout="topleft" +     name="zoom_in"> +        <menu_item_call.on_click +         function="Url.ZoomInObject" /> +    </menu_item_call> +    <menu_item_call       label="Show on Map"       layout="topleft"       name="show_on_map"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 9963ccd84b..f188ede456 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -12147,6 +12147,17 @@ Cannot create large prims that intersect other residents.  Please re-try when ot    <notification     icon="alertmodal.tga" +   name="PreferenceQualityWithLowMemory" +   type="alert"> +Your system has [TOTAL_MEM]MB of memory, which might not be enough to run viewer at higher settings and might result in issues. +      <usetemplate +       name="okcancelbuttons" +       notext="Cancel" +       yestext="Continue"/> +  </notification> + +  <notification +   icon="alertmodal.tga"     name="DefaultObjectPermissions"     type="alert">  	There was a problem saving the default object permissions: [REASON].  Please try setting the default permissions later. diff --git a/indra/newview/skins/default/xui/es/floater_search.xml b/indra/newview/skins/default/xui/es/floater_search.xml deleted file mode 100644 index e24d8064a1..0000000000 --- a/indra/newview/skins/default/xui/es/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Cargando... -	</floater.string> -	<floater.string name="done_text"> -		Hecho -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Redo search to reflect current God level -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_search.xml b/indra/newview/skins/default/xui/fr/floater_search.xml deleted file mode 100644 index 32800182ea..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Chargement... -	</floater.string> -	<floater.string name="done_text"> -		Terminé -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Relancer la recherche pour refléter le niveau divin actuel -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/it/floater_search.xml b/indra/newview/skins/default/xui/it/floater_search.xml deleted file mode 100644 index ac3dc17aa3..0000000000 --- a/indra/newview/skins/default/xui/it/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Caricamento in corso... -	</floater.string> -	<floater.string name="done_text"> -		Fine -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Ripeti ricerca in modo che rifletta il livello di diritti Admin attuale -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_search.xml b/indra/newview/skins/default/xui/ja/floater_search.xml deleted file mode 100644 index 531ac77f95..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		読み込んでいます…。 -	</floater.string> -	<floater.string name="done_text"> -		完了 -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				現在のゴッドレベルに反映させるため、検索をやり直してください。 -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_search.xml b/indra/newview/skins/default/xui/pt/floater_search.xml deleted file mode 100644 index 3509cb786d..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Carregando... -	</floater.string> -	<floater.string name="done_text"> -		Pronto -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Buscar novamente com status God -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_search.xml b/indra/newview/skins/default/xui/ru/floater_search.xml deleted file mode 100644 index 405a6598ac..0000000000 --- a/indra/newview/skins/default/xui/ru/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Загрузка... -	</floater.string> -	<floater.string name="done_text"> -		Готово -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Повторить поиск, чтобы показать текущий уровень творца -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_search.xml b/indra/newview/skins/default/xui/tr/floater_search.xml deleted file mode 100644 index 08c1e5162c..0000000000 --- a/indra/newview/skins/default/xui/tr/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		Yükleniyor... -	</floater.string> -	<floater.string name="done_text"> -		Tamamlandı -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				Mevcut Yönetici seviyesini dikkate alarak aramayı yenile -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_search.xml b/indra/newview/skins/default/xui/zh/floater_search.xml deleted file mode 100644 index 3e85a529ae..0000000000 --- a/indra/newview/skins/default/xui/zh/floater_search.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_search" title=""> -	<floater.string name="loading_text"> -		載入中... -	</floater.string> -	<floater.string name="done_text"> -		完成 -	</floater.string> -	<layout_stack name="stack1"> -		<layout_panel name="browser_layout"> -			<text name="refresh_search"> -				以目前具備的神階級再搜尋一次 -			</text> -		</layout_panel> -	</layout_stack> -</floater> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 7f5db61545..741db1139e 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -63,7 +63,6 @@ class ViewerManifest(LLManifest):      def construct(self):          super(ViewerManifest, self).construct()          self.path(src="../../scripts/messages/message_template.msg", dst="app_settings/message_template.msg") -        self.path(src="../../etc/message.xml", dst="app_settings/message.xml")          os.environ["XZ_DEFAULTS"] = "-T0" @@ -277,13 +276,13 @@ class ViewerManifest(LLManifest):          # All lines up to and including the first blank line are the file header; skip them          lines.reverse() # so that pop will pull from first to last line -        while not re.match("\s*$", lines.pop()) : +        while not re.match(r"\s*$", lines.pop()) :              pass # do nothing          # A line that starts with a non-whitespace character is a name; all others describe contributions, so collect the names          names = []          for line in lines : -            if re.match("\S", line) : +            if re.match(r"\S", line) :                  names.append(line.rstrip())          # It's not fair to always put the same people at the head of the list          random.shuffle(names) diff --git a/indra/tools/vstool/DispatchUtility.cs b/indra/tools/vstool/DispatchUtility.cs deleted file mode 100644 index 6056ac55a1..0000000000 --- a/indra/tools/vstool/DispatchUtility.cs +++ /dev/null @@ -1,271 +0,0 @@ -#region Using Directives
 -
 -using System;
 -using System.Collections.Generic;
 -using System.Text;
 -using System.Runtime.InteropServices;
 -using System.Reflection;
 -using System.Security.Permissions;
 -
 -#endregion
 -
 -namespace TestDispatchUtility
 -{
 -	/// <summary>
 -	/// Provides helper methods for working with COM IDispatch objects that have a registered type library.
 -	/// </summary>
 -	public static class DispatchUtility
 -	{
 -		#region Private Constants
 -
 -		private const int S_OK = 0; //From WinError.h
 -		private const int LOCALE_SYSTEM_DEFAULT = 2 << 10; //From WinNT.h == 2048 == 0x800
 -
 -		#endregion
 -
 -		#region Public Methods
 -
 -		/// <summary>
 -		/// Gets whether the specified object implements IDispatch.
 -		/// </summary>
 -		/// <param name="obj">An object to check.</param>
 -		/// <returns>True if the object implements IDispatch.  False otherwise.</returns>
 -		public static bool ImplementsIDispatch(object obj)
 -		{
 -			bool result = obj is IDispatchInfo;
 -			return result;
 -		}
 -
 -		/// <summary>
 -		/// Gets a Type that can be used with reflection.
 -		/// </summary>
 -		/// <param name="obj">An object that implements IDispatch.</param>
 -		/// <param name="throwIfNotFound">Whether an exception should be thrown if a Type can't be obtained.</param>
 -		/// <returns>A .NET Type that can be used with reflection.</returns>
 -		/// <exception cref="InvalidCastException">If <paramref name="obj"/> doesn't implement IDispatch.</exception>
 -		[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
 -		public static Type GetType(object obj, bool throwIfNotFound)
 -		{
 -			RequireReference(obj, "obj");
 -			Type result = GetType((IDispatchInfo)obj, throwIfNotFound);
 -			return result;
 -		}
 -
 -		/// <summary>
 -		/// Tries to get the DISPID for the requested member name.
 -		/// </summary>
 -		/// <param name="obj">An object that implements IDispatch.</param>
 -		/// <param name="name">The name of a member to lookup.</param>
 -		/// <param name="dispId">If the method returns true, this holds the DISPID on output.
 -		/// If the method returns false, this value should be ignored.</param>
 -		/// <returns>True if the member was found and resolved to a DISPID.  False otherwise.</returns>
 -		/// <exception cref="InvalidCastException">If <paramref name="obj"/> doesn't implement IDispatch.</exception>
 -		[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
 -		public static bool TryGetDispId(object obj, string name, out int dispId)
 -		{
 -			RequireReference(obj, "obj");
 -			bool result = TryGetDispId((IDispatchInfo)obj, name, out dispId);
 -			return result;
 -		}
 -
 -		/// <summary>
 -		/// Invokes a member by DISPID.
 -		/// </summary>
 -		/// <param name="obj">An object that implements IDispatch.</param>
 -		/// <param name="dispId">The DISPID of a member.  This can be obtained using
 -		/// <see cref="TryGetDispId(object, string, out int)"/>.</param>
 -		/// <param name="args">The arguments to pass to the member.</param>
 -		/// <returns>The member's return value.</returns>
 -		/// <remarks>
 -		/// This can invoke a method or a property get accessor.
 -		/// </remarks>
 -		public static object Invoke(object obj, int dispId, object[] args)
 -		{
 -			string memberName = "[DispId=" + dispId + "]";
 -			object result = Invoke(obj, memberName, args);
 -			return result;
 -		}
 -
 -		/// <summary>
 -		/// Invokes a member by name.
 -		/// </summary>
 -		/// <param name="obj">An object.</param>
 -		/// <param name="memberName">The name of the member to invoke.</param>
 -		/// <param name="args">The arguments to pass to the member.</param>
 -		/// <returns>The member's return value.</returns>
 -		/// <remarks>
 -		/// This can invoke a method or a property get accessor.
 -		/// </remarks>
 -		public static object Invoke(object obj, string memberName, object[] args)
 -		{
 -			RequireReference(obj, "obj");
 -			Type type = obj.GetType();
 -			object result = type.InvokeMember(memberName, BindingFlags.InvokeMethod | BindingFlags.GetProperty,
 -				null, obj, args, null);
 -			return result;
 -		}
 -
 -		#endregion
 -
 -		#region Private Methods
 -
 -		/// <summary>
 -		/// Requires that the value is non-null.
 -		/// </summary>
 -		/// <typeparam name="T">The type of the value.</typeparam>
 -		/// <param name="value">The value to check.</param>
 -		/// <param name="name">The name of the value.</param>
 -		private static void RequireReference<T>(T value, string name) where T : class
 -		{
 -			if (value == null)
 -			{
 -				throw new ArgumentNullException(name);
 -			}
 -		}
 -
 -		/// <summary>
 -		/// Gets a Type that can be used with reflection.
 -		/// </summary>
 -		/// <param name="dispatch">An object that implements IDispatch.</param>
 -		/// <param name="throwIfNotFound">Whether an exception should be thrown if a Type can't be obtained.</param>
 -		/// <returns>A .NET Type that can be used with reflection.</returns>
 -		private static Type GetType(IDispatchInfo dispatch, bool throwIfNotFound)
 -		{
 -			RequireReference(dispatch, "dispatch");
 -
 -			Type result = null;
 -			int typeInfoCount;
 -			int hr = dispatch.GetTypeInfoCount(out typeInfoCount);
 -			if (hr == S_OK && typeInfoCount > 0)
 -			{
 -				// Type info isn't usually culture-aware for IDispatch, so we might as well pass
 -				// the default locale instead of looking up the current thread's LCID each time
 -				// (via CultureInfo.CurrentCulture.LCID).
 -				dispatch.GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, out result);
 -			}
 -
 -			if (result == null && throwIfNotFound)
 -			{
 -				// If the GetTypeInfoCount called failed, throw an exception for that.
 -				Marshal.ThrowExceptionForHR(hr);
 -
 -				// Otherwise, throw the same exception that Type.GetType would throw.
 -				throw new TypeLoadException();
 -			}
 -
 -			return result;
 -		}
 -
 -		/// <summary>
 -		/// Tries to get the DISPID for the requested member name.
 -		/// </summary>
 -		/// <param name="dispatch">An object that implements IDispatch.</param>
 -		/// <param name="name">The name of a member to lookup.</param>
 -		/// <param name="dispId">If the method returns true, this holds the DISPID on output.
 -		/// If the method returns false, this value should be ignored.</param>
 -		/// <returns>True if the member was found and resolved to a DISPID.  False otherwise.</returns>
 -		private static bool TryGetDispId(IDispatchInfo dispatch, string name, out int dispId)
 -		{
 -			RequireReference(dispatch, "dispatch");
 -			RequireReference(name, "name");
 -
 -			bool result = false;
 -
 -			// Members names aren't usually culture-aware for IDispatch, so we might as well
 -			// pass the default locale instead of looking up the current thread's LCID each time
 -			// (via CultureInfo.CurrentCulture.LCID).
 -			Guid iidNull = Guid.Empty;
 -			int hr = dispatch.GetDispId(ref iidNull, ref name, 1, LOCALE_SYSTEM_DEFAULT, out dispId);
 -
 -			const int DISP_E_UNKNOWNNAME = unchecked((int)0x80020006); //From WinError.h
 -			const int DISPID_UNKNOWN = -1; //From OAIdl.idl
 -			if (hr == S_OK)
 -			{
 -				result = true;
 -			}
 -			else if (hr == DISP_E_UNKNOWNNAME && dispId == DISPID_UNKNOWN)
 -			{
 -				// This is the only supported "error" case because it means IDispatch
 -				// is saying it doesn't know the member we asked about.
 -				result = false;
 -			}
 -			else
 -			{
 -				// The other documented result codes are all errors.
 -				Marshal.ThrowExceptionForHR(hr);
 -			}
 -
 -			return result;
 -		}
 -
 -		#endregion
 -
 -		#region Private Interfaces
 -
 -		/// <summary>
 -		/// A partial declaration of IDispatch used to lookup Type information and DISPIDs.
 -		/// </summary>
 -		/// <remarks>
 -		/// This interface only declares the first three methods of IDispatch.  It omits the
 -		/// fourth method (Invoke) because there are already plenty of ways to do dynamic
 -		/// invocation in .NET.  But the first three methods provide dynamic type metadata
 -		/// discovery, which .NET doesn't provide normally if you have a System.__ComObject
 -		/// RCW instead of a strongly-typed RCW.
 -		/// <para/>
 -		/// Note: The original declaration of IDispatch is in OAIdl.idl.
 -		/// </remarks>
 -		[ComImport]
 -		[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 -		[Guid("00020400-0000-0000-C000-000000000046")]
 -		private interface IDispatchInfo
 -		{
 -			/// <summary>
 -			/// Gets the number of Types that the object provides (0 or 1).
 -			/// </summary>
 -			/// <param name="typeInfoCount">Returns 0 or 1 for the number of Types provided by <see cref="GetTypeInfo"/>.</param>
 -			/// <remarks>
 -			/// http://msdn.microsoft.com/en-us/library/da876d53-cb8a-465c-a43e-c0eb272e2a12(VS.85)
 -			/// </remarks>
 -			[PreserveSig]
 -			int GetTypeInfoCount(out int typeInfoCount);
 -
 -			/// <summary>
 -			/// Gets the Type information for an object if <see cref="GetTypeInfoCount"/> returned 1.
 -			/// </summary>
 -			/// <param name="typeInfoIndex">Must be 0.</param>
 -			/// <param name="lcid">Typically, LOCALE_SYSTEM_DEFAULT (2048).</param>
 -			/// <param name="typeInfo">Returns the object's Type information.</param>
 -			/// <remarks>
 -			/// http://msdn.microsoft.com/en-us/library/cc1ec9aa-6c40-4e70-819c-a7c6dd6b8c99(VS.85)
 -			/// </remarks>
 -			void GetTypeInfo(int typeInfoIndex, int lcid, [MarshalAs(UnmanagedType.CustomMarshaler,
 -				MarshalTypeRef = typeof(System.Runtime.InteropServices.CustomMarshalers.TypeToTypeInfoMarshaler))] out Type typeInfo);
 -
 -			/// <summary>
 -			/// Gets the DISPID of the specified member name.
 -			/// </summary>
 -			/// <param name="riid">Must be IID_NULL.  Pass a copy of Guid.Empty.</param>
 -			/// <param name="name">The name of the member to look up.</param>
 -			/// <param name="nameCount">Must be 1.</param>
 -			/// <param name="lcid">Typically, LOCALE_SYSTEM_DEFAULT (2048).</param>
 -			/// <param name="dispId">If a member with the requested <paramref name="name"/>
 -			/// is found, this returns its DISPID and the method's return value is 0.
 -			/// If the method returns a non-zero value, then this parameter's output value is
 -			/// undefined.</param>
 -			/// <returns>Zero for success. Non-zero for failure.</returns>
 -			/// <remarks>
 -			/// http://msdn.microsoft.com/en-us/library/6f6cf233-3481-436e-8d6a-51f93bf91619(VS.85)
 -			/// </remarks>
 -			[PreserveSig]
 -			int GetDispId(ref Guid riid, ref string name, int nameCount, int lcid, out int dispId);
 -
 -			// NOTE: The real IDispatch also has an Invoke method next, but we don't need it.
 -			// We can invoke methods using .NET's Type.InvokeMember method with the special
 -			// [DISPID=n] syntax for member "names", or we can get a .NET Type using GetTypeInfo
 -			// and invoke methods on that through reflection.
 -			// Type.InvokeMember: http://msdn.microsoft.com/en-us/library/de3dhzwy.aspx
 -		}
 -
 -		#endregion
 -	}
 -}
 diff --git a/indra/tools/vstool/README.txt b/indra/tools/vstool/README.txt deleted file mode 100644 index e419180031..0000000000 --- a/indra/tools/vstool/README.txt +++ /dev/null @@ -1,9 +0,0 @@ -VSTool is a command line utility to manipulate VisualStudio settings. 
 -
 -The windows cmake project configuration uses VSTool.exe
 -
 -A handy upgrade:
 - figure out how to make cmake build this csharp app
 - - or write the app using script (jscript?!?) so it doesn't need to be built.
 -
 -
 diff --git a/indra/tools/vstool/VSTool.csproj b/indra/tools/vstool/VSTool.csproj deleted file mode 100755 index 7f431e85c7..0000000000 --- a/indra/tools/vstool/VSTool.csproj +++ /dev/null @@ -1,98 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?>
 -<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
 -  <PropertyGroup>
 -    <ProjectType>Local</ProjectType>
 -    <ProductVersion>8.0.50727</ProductVersion>
 -    <SchemaVersion>2.0</SchemaVersion>
 -    <ProjectGuid>{96943E2D-1373-4617-A117-D0F997A94919}</ProjectGuid>
 -    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
 -    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
 -    <ApplicationIcon>
 -    </ApplicationIcon>
 -    <AssemblyKeyContainerName>
 -    </AssemblyKeyContainerName>
 -    <AssemblyName>VSTool</AssemblyName>
 -    <AssemblyOriginatorKeyFile>
 -    </AssemblyOriginatorKeyFile>
 -    <DefaultClientScript>JScript</DefaultClientScript>
 -    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
 -    <DefaultTargetSchema>IE50</DefaultTargetSchema>
 -    <DelaySign>false</DelaySign>
 -    <OutputType>Exe</OutputType>
 -    <RootNamespace>VSTool</RootNamespace>
 -    <RunPostBuildEvent>Always</RunPostBuildEvent>
 -    <StartupObject>VSTool.VSToolMain</StartupObject>
 -    <FileUpgradeFlags>
 -    </FileUpgradeFlags>
 -    <UpgradeBackupLocation>
 -    </UpgradeBackupLocation>
 -    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
 -    <OldToolsVersion>2.0</OldToolsVersion>
 -  </PropertyGroup>
 -  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
 -    <OutputPath>.\</OutputPath>
 -    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
 -    <BaseAddress>285212672</BaseAddress>
 -    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
 -    <ConfigurationOverrideFile>
 -    </ConfigurationOverrideFile>
 -    <DefineConstants>DEBUG;TRACE</DefineConstants>
 -    <DocumentationFile>
 -    </DocumentationFile>
 -    <DebugSymbols>true</DebugSymbols>
 -    <FileAlignment>4096</FileAlignment>
 -    <NoStdLib>false</NoStdLib>
 -    <NoWarn>
 -    </NoWarn>
 -    <Optimize>false</Optimize>
 -    <RegisterForComInterop>false</RegisterForComInterop>
 -    <RemoveIntegerChecks>false</RemoveIntegerChecks>
 -    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
 -    <WarningLevel>4</WarningLevel>
 -    <DebugType>full</DebugType>
 -    <ErrorReport>prompt</ErrorReport>
 -  </PropertyGroup>
 -  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
 -    <OutputPath>.\</OutputPath>
 -    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
 -    <BaseAddress>285212672</BaseAddress>
 -    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
 -    <ConfigurationOverrideFile>
 -    </ConfigurationOverrideFile>
 -    <DefineConstants>TRACE</DefineConstants>
 -    <DocumentationFile>
 -    </DocumentationFile>
 -    <DebugSymbols>false</DebugSymbols>
 -    <FileAlignment>4096</FileAlignment>
 -    <NoStdLib>false</NoStdLib>
 -    <NoWarn>
 -    </NoWarn>
 -    <Optimize>true</Optimize>
 -    <RegisterForComInterop>false</RegisterForComInterop>
 -    <RemoveIntegerChecks>false</RemoveIntegerChecks>
 -    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
 -    <WarningLevel>4</WarningLevel>
 -    <DebugType>none</DebugType>
 -    <ErrorReport>prompt</ErrorReport>
 -  </PropertyGroup>
 -  <ItemGroup>
 -    <Reference Include="System">
 -      <Name>System</Name>
 -    </Reference>
 -    <Reference Include="System.Data">
 -      <Name>System.Data</Name>
 -    </Reference>
 -  </ItemGroup>
 -  <ItemGroup>
 -    <Compile Include="main.cs">
 -      <SubType>Code</SubType>
 -    </Compile>
 -  </ItemGroup>
 -  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
 -  <PropertyGroup>
 -    <PreBuildEvent>
 -    </PreBuildEvent>
 -    <PostBuildEvent>
 -    </PostBuildEvent>
 -  </PropertyGroup>
 -</Project>
\ No newline at end of file diff --git a/indra/tools/vstool/VSTool.exe b/indra/tools/vstool/VSTool.exe Binary files differdeleted file mode 100755 index 751540413a..0000000000 --- a/indra/tools/vstool/VSTool.exe +++ /dev/null diff --git a/indra/tools/vstool/VSTool.sln b/indra/tools/vstool/VSTool.sln deleted file mode 100755 index 21e3d75971..0000000000 --- a/indra/tools/vstool/VSTool.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 11.00
 -# Visual Studio 2010
 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSTool", "VSTool.csproj", "{96943E2D-1373-4617-A117-D0F997A94919}"
 -EndProject
 -Global
 -	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 -		Debug|Any CPU = Debug|Any CPU
 -		Release|Any CPU = Release|Any CPU
 -	EndGlobalSection
 -	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 -		{96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 -		{96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.Build.0 = Debug|Any CPU
 -		{96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.ActiveCfg = Release|Any CPU
 -		{96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.Build.0 = Release|Any CPU
 -	EndGlobalSection
 -	GlobalSection(SolutionProperties) = preSolution
 -		HideSolutionNode = FALSE
 -	EndGlobalSection
 -EndGlobal
 diff --git a/indra/tools/vstool/app.config b/indra/tools/vstool/app.config deleted file mode 100644 index 8494f728ff..0000000000 --- a/indra/tools/vstool/app.config +++ /dev/null @@ -1,3 +0,0 @@ -<?xml version="1.0"?>
 -<configuration>
 -<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
 diff --git a/indra/tools/vstool/main.cs b/indra/tools/vstool/main.cs deleted file mode 100755 index 1d6b2f14d1..0000000000 --- a/indra/tools/vstool/main.cs +++ /dev/null @@ -1,733 +0,0 @@ -// Code about getting running instances visual studio
 -// was borrowed from 
 -// http://www.codeproject.com/KB/cs/automatingvisualstudio.aspx
 -
 -
 -using System;
 -using System.Collections;
 -using System.Collections.Generic;
 -using System.Reflection;
 -using System.Runtime.InteropServices;
 -using System.Runtime.InteropServices.ComTypes;
 -using Microsoft.CSharp;
 -
 -namespace VSTool
 -{
 -    // The MessageFilter class comes from:
 -    // http://msdn.microsoft.com/en-us/library/ms228772(VS.80).aspx
 -    // It allows vstool to get timing error messages from 
 -    // visualstudio and handle them.
 -    public class MessageFilter : IOleMessageFilter
 -    {
 -        //
 -        // Class containing the IOleMessageFilter
 -        // thread error-handling functions.
 -
 -        // Start the filter.
 -        public static void Register()
 -        {
 -            IOleMessageFilter newFilter = new MessageFilter(); 
 -            IOleMessageFilter oldFilter = null; 
 -            CoRegisterMessageFilter(newFilter, out oldFilter);
 -        }
 -
 -        // Done with the filter, close it.
 -        public static void Revoke()
 -        {
 -            IOleMessageFilter oldFilter = null; 
 -            CoRegisterMessageFilter(null, out oldFilter);
 -        }
 -
 -        //
 -        // IOleMessageFilter functions.
 -        // Handle incoming thread requests.
 -        int IOleMessageFilter.HandleInComingCall(int dwCallType, 
 -          System.IntPtr hTaskCaller, int dwTickCount, System.IntPtr 
 -          lpInterfaceInfo) 
 -        {
 -            //Return the flag SERVERCALL_ISHANDLED.
 -            return 0;
 -        }
 -
 -        // Thread call was rejected, so try again.
 -        int IOleMessageFilter.RetryRejectedCall(System.IntPtr 
 -          hTaskCallee, int dwTickCount, int dwRejectType)
 -        {
 -            if (dwRejectType == 2)
 -            // flag = SERVERCALL_RETRYLATER.
 -            {
 -                // Retry the thread call immediately if return >=0 & 
 -                // <100.
 -                return 99;
 -            }
 -            // Too busy; cancel call.
 -            return -1;
 -        }
 -
 -        int IOleMessageFilter.MessagePending(System.IntPtr hTaskCallee, 
 -          int dwTickCount, int dwPendingType)
 -        {
 -            //Return the flag PENDINGMSG_WAITDEFPROCESS.
 -            return 2; 
 -        }
 -
 -        // Implement the IOleMessageFilter interface.
 -        [DllImport("Ole32.dll")]
 -        private static extern int 
 -          CoRegisterMessageFilter(IOleMessageFilter newFilter, out 
 -          IOleMessageFilter oldFilter);
 -    }
 -
 -    [ComImport(), Guid("00000016-0000-0000-C000-000000000046"), 
 -    InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
 -    interface IOleMessageFilter 
 -    {
 -        [PreserveSig]
 -        int HandleInComingCall( 
 -            int dwCallType, 
 -            IntPtr hTaskCaller, 
 -            int dwTickCount, 
 -            IntPtr lpInterfaceInfo);
 -
 -        [PreserveSig]
 -        int RetryRejectedCall( 
 -            IntPtr hTaskCallee, 
 -            int dwTickCount,
 -            int dwRejectType);
 -
 -        [PreserveSig]
 -        int MessagePending( 
 -            IntPtr hTaskCallee, 
 -            int dwTickCount,
 -            int dwPendingType);
 -    }
 -
 -    class ViaCOM
 -    {
 -        public static object GetProperty(object from_obj, string prop_name)
 -        {
 -            try
 -            {
 -                Type objType = from_obj.GetType();
 -                return objType.InvokeMember(
 -                    prop_name,
 -                    BindingFlags.GetProperty, null,
 -                    from_obj,
 -                    null);
 -            }
 -            catch (Exception e)
 -            {
 -                Console.WriteLine("Error getting property: \"{0}\"", prop_name);
 -                Console.WriteLine(e.Message);
 -                throw e;
 -            }
 -        }
 -
 -        public static object SetProperty(object from_obj, string prop_name, object new_value)
 -        {
 -            try
 -            {
 -                object[] args = { new_value };
 -                Type objType = from_obj.GetType();
 -                return objType.InvokeMember(
 -                    prop_name,
 -                    BindingFlags.DeclaredOnly |
 -                    BindingFlags.Public |
 -                    BindingFlags.NonPublic |
 -                    BindingFlags.Instance |
 -                    BindingFlags.SetProperty,
 -                    null,
 -                    from_obj,
 -                    args);
 -            }
 -            catch (Exception e)
 -            {
 -                Console.WriteLine("Error setting property: \"{0}\"", prop_name);
 -                Console.WriteLine(e.Message);
 -                throw e;
 -            }
 -        }
 -
 -        public static object CallMethod(object from_obj, string method_name, params object[] args)
 -        {
 -            try
 -            {
 -                Type objType = from_obj.GetType();
 -                return objType.InvokeMember(
 -                    method_name,
 -                    BindingFlags.DeclaredOnly |
 -                    BindingFlags.Public |
 -                    BindingFlags.NonPublic |
 -                    BindingFlags.Instance |
 -                    BindingFlags.InvokeMethod,
 -                    null,
 -                    from_obj,
 -                    args);
 -            }
 -            catch (Exception e)
 -            {
 -                Console.WriteLine("Error calling method \"{0}\"", method_name);
 -                Console.WriteLine(e.Message);
 -                throw e;
 -            }
 -        }
 -    };
 -
 -    /// <summary>
 -	/// The main entry point class for VSTool.
 -	/// </summary>
 -    class VSToolMain
 -    {
 -        #region Interop imports
 -        [DllImport("ole32.dll")]  
 -        public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot); 
 - 
 -        [DllImport("ole32.dll")]  
 -        public static extern int  CreateBindCtx(int reserved, out IBindCtx ppbc);
 -        #endregion 
 -
 -        static System.Boolean ignore_case = true;
 -
 -        static string solution_name = null;
 -        static bool use_new_vs = false;
 -        static Hashtable projectDict = new Hashtable();
 -        static string startup_project = null;
 -        static string config = null;
 -
 -        static object dte = null;
 -        static object solution = null;
 -
 -        /// <summary>
 -		/// The main entry point for the application.
 -		/// </summary>
 -		[STAThread]
 -		static int Main(string[] args)
 -		{
 -            int retVal = 0;
 -            bool need_save = false;
 -
 -            try
 -            {
 -                parse_command_line(args);
 -
 -                Console.WriteLine("Editing solution: {0}", solution_name);
 -
 -                bool found_open_solution = GetDTEAndSolution();
 -
 -                if (dte == null || solution == null)
 -                {
 -                    retVal = 1;
 -                }
 -                else
 -                {
 -                    MessageFilter.Register();
 -
 -                    // Walk through all of the projects in the solution
 -                    // and list the type of each project.
 -                    foreach (DictionaryEntry p in projectDict)
 -                    {
 -                        string project_name = (string)p.Key;
 -                        string working_dir = (string)p.Value;
 -                        if (SetProjectWorkingDir(solution, project_name, working_dir))
 -                        {
 -                            need_save = true;
 -                        }
 -                    }
 -
 -                    if (config != null)
 -                    {
 -                        need_save = SetActiveConfig(config);
 -                    }
 -
 -                    if (startup_project != null)
 -                    {
 -                        need_save = SetStartupProject(startup_project);
 -                    }
 -
 -                    if (need_save)
 -                    {
 -                        if (found_open_solution == false)
 -                        {
 -                            ViaCOM.CallMethod(solution, "Close", null);
 -                        }
 -                    }
 -                }
 -            }
 -            catch (Exception e)
 -            {
 -                Console.WriteLine(e.Message);
 -                retVal = 1;
 -            }
 -            finally
 -            {
 -                if (solution != null)
 -                {
 -                    Marshal.ReleaseComObject(solution);
 -                    solution = null;
 -                }
 -
 -                if (dte != null)
 -                {
 -                    Marshal.ReleaseComObject(dte);
 -                    dte = null;
 -                }
 -
 -                MessageFilter.Revoke();
 -            }
 -            return retVal;
 -        }
 -
 -        public static bool parse_command_line(string[] args)
 -        {
 -            string options_desc = 
 -                "--solution <solution_name>   : MSVC solution name. (required)\n" +
 -                "--use_new_vs                 : Ignore running versions of visual studio.\n" +
 -                "--workingdir <project> <dir> : Set working dir of a VC project.\n" +
 -                "--config <config>            : Set the active config for the solution.\n" +
 -                "--startup <project>          : Set the startup project for the solution.\n";
 -
 -            try
 -            {
 -                // Command line param parsing loop.
 -                int i = 0;
 -                for (; i < args.Length; ++i)
 -                {
 -                    if ("--solution" == args[i])
 -                    {
 -                        if (solution_name != null)
 -                        {
 -                            throw new ApplicationException("Found second --solution option");
 -                        }
 -                        solution_name = args[++i];
 -                    }
 -                    else if ("--use_new_vs" == args[i])
 -                    {
 -                        use_new_vs = true;
 -                    }
 -
 -                    else if ("--workingdir" == args[i])
 -                    {
 -                        string project_name = args[++i];
 -                        string working_dir = args[++i];
 -                        projectDict.Add(project_name, working_dir);
 -                    }
 -                    else if ("--config" == args[i])
 -                    {
 -                        if (config != null)
 -                        {
 -                            throw new ApplicationException("Found second --config option");
 -                        }
 -                        config = args[++i];
 -                    }
 -                    else if ("--startup" == args[i])
 -                    {
 -                        if (startup_project != null)
 -                        {
 -                            throw new ApplicationException("Found second --startup option");
 -                        }
 -                        startup_project = args[++i];
 -                    }
 -                    else
 -                    {
 -                        throw new ApplicationException("Found unrecognized token on command line: " + args[i]);
 -                    }
 -                }
 -
 -                if (solution_name == null)
 -                {
 -                    throw new ApplicationException("The --solution option is required.");
 -                }
 -            }
 -            catch(ApplicationException e)
 -            {
 -
 -                Console.WriteLine("Oops! " + e.Message);
 -                Console.Write("Command line:");
 -                foreach (string arg in args)
 -                {
 -                    Console.Write(" " + arg);
 -                }
 -                Console.Write("\n\n");
 -                Console.WriteLine("VSTool command line usage");
 -                Console.Write(options_desc);
 -                throw e;
 -            }
 -            return true;
 -        }
 -
 -        public static bool GetDTEAndSolution()
 -        {
 -            bool found_open_solution = true;
 -
 -            Console.WriteLine("Looking for existing VisualStudio instance...");
 -
 -            // Get an instance of the currently running Visual Studio .NET IDE.
 -            // dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.7.1");
 -            string full_solution_name = System.IO.Path.GetFullPath(solution_name);
 -            if (false == use_new_vs)
 -            {
 -                dte = GetIDEInstance(full_solution_name);
 -            }
 -
 -            if (dte == null)
 -            {
 -                try
 -                {
 -                    Console.WriteLine("  Didn't find open solution, starting new background VisualStudio instance...");
 -                    Console.WriteLine("  Reading .sln file version...");
 -                    string version = GetSolutionVersion(full_solution_name);
 -
 -                    Console.WriteLine("  Using version: {0}...", version);
 -                    string progid = GetVSProgID(version);
 -
 -                    Type objType = Type.GetTypeFromProgID(progid);
 -                    dte = System.Activator.CreateInstance(objType);
 -                    Console.WriteLine("  Reading solution: \"{0}\"", full_solution_name);
 -
 -                    solution = ViaCOM.GetProperty(dte, "Solution");
 -                    object[] openArgs = { full_solution_name };
 -                    ViaCOM.CallMethod(solution, "Open", openArgs);
 -                }
 -                catch (Exception e)
 -                {
 -                    Console.WriteLine(e.Message);
 -                    Console.WriteLine("Quitting do to error opening: {0}", full_solution_name);
 -                    solution = null;
 -                    dte = null;
 -                    return found_open_solution;
 -                }
 -                found_open_solution = false;
 -            }
 -
 -            if (solution == null)
 -            {
 -                solution = ViaCOM.GetProperty(dte, "Solution");
 -            }
 -
 -            return found_open_solution;
 -        }
 -
 -        /// <summary>
 -        /// Get the DTE object for the instance of Visual Studio IDE that has 
 -        /// the specified solution open.
 -        /// </summary>
 -        /// <param name="solutionFile">The absolute filename of the solution</param>
 -        /// <returns>Corresponding DTE object or null if no such IDE is running</returns>
 -        public static object GetIDEInstance( string solutionFile )
 -        {
 -            Hashtable runningInstances = GetIDEInstances( true );
 -            IDictionaryEnumerator enumerator = runningInstances.GetEnumerator();
 -
 -            while ( enumerator.MoveNext() )
 -            {
 -                try
 -                {
 -                    object ide = enumerator.Value;
 -                    if (ide != null)
 -                    {
 -                        object sol = ViaCOM.GetProperty(ide, "Solution");
 -                        if (0 == string.Compare((string)ViaCOM.GetProperty(sol, "FullName"), solutionFile, ignore_case))
 -                        {
 -                            return ide;
 -                        }
 -                    }
 -                } 
 -                catch{}
 -            }
 -
 -            return null;
 -        }
 -
 -        /// <summary>
 -        /// Get a table of the currently running instances of the Visual Studio .NET IDE.
 -        /// </summary>
 -        /// <param name="openSolutionsOnly">Only return instances that have opened a solution</param>
 -        /// <returns>A hashtable mapping the name of the IDE in the running object table to the corresponding DTE object</returns>
 -        public static Hashtable GetIDEInstances( bool openSolutionsOnly )
 -        {
 -            Hashtable runningIDEInstances = new Hashtable();
 -            Hashtable runningObjects = GetRunningObjectTable();
 -
 -            IDictionaryEnumerator rotEnumerator = runningObjects.GetEnumerator();
 -            while ( rotEnumerator.MoveNext() )
 -            {
 -                string candidateName = (string) rotEnumerator.Key;
 -                if (!candidateName.StartsWith("!VisualStudio.DTE"))
 -                    continue;
 -
 -                object ide = rotEnumerator.Value;
 -                if (ide == null)
 -                    continue;
 -
 -                if (openSolutionsOnly)
 -                {
 -                    try
 -                    {
 -                        object sol = ViaCOM.GetProperty(ide, "Solution");
 -                        string solutionFile = (string)ViaCOM.GetProperty(sol, "FullName");
 -                        if (solutionFile != String.Empty)
 -                        {
 -                            runningIDEInstances[ candidateName ] = ide;
 -                        }
 -                    } 
 -                    catch {}
 -                }
 -                else
 -                {
 -                    runningIDEInstances[ candidateName ] = ide;
 -                }                       
 -            }
 -            return runningIDEInstances;
 -        }
 -
 -        /// <summary>
 -        /// Get a snapshot of the running object table (ROT).
 -        /// </summary>
 -        /// <returns>A hashtable mapping the name of the object in the ROT to the corresponding object</returns>
 -        [STAThread]
 -        public static Hashtable GetRunningObjectTable()
 -        {
 -            Hashtable result = new Hashtable();
 -
 -            int numFetched = 0;
 -            IRunningObjectTable runningObjectTable;   
 -            IEnumMoniker monikerEnumerator;
 -            IMoniker[] monikers = new IMoniker[1];
 -
 -            GetRunningObjectTable(0, out runningObjectTable);    
 -            runningObjectTable.EnumRunning(out monikerEnumerator);
 -            monikerEnumerator.Reset();          
 -            
 -            while (monikerEnumerator.Next(1, monikers, new IntPtr(numFetched)) == 0)
 -            {     
 -                IBindCtx ctx;
 -                CreateBindCtx(0, out ctx);     
 -                    
 -                string runningObjectName;
 -                monikers[0].GetDisplayName(ctx, null, out runningObjectName);
 -
 -                object runningObjectVal;  
 -                runningObjectTable.GetObject( monikers[0], out runningObjectVal); 
 -
 -                result[ runningObjectName ] = runningObjectVal;
 -            } 
 -
 -            return result;
 -        }
 -
 -        public static string GetSolutionVersion(string solutionFullFileName) 
 -        {
 -            string version;
 -            System.IO.StreamReader solutionStreamReader = null;
 -            string firstLine;
 -            string format;
 -            
 -            try
 -            {
 -                solutionStreamReader = new System.IO.StreamReader(solutionFullFileName);
 -                do
 -                {
 -                    firstLine = solutionStreamReader.ReadLine();
 -                }
 -                while (firstLine == "");
 -                
 -                format = firstLine.Substring(firstLine.LastIndexOf(" ")).Trim();
 -        
 -                switch(format)
 -                {
 -                    case "7.00":
 -                        version = "VC70";
 -                        break;
 -
 -                    case "8.00":
 -                        version = "VC71";
 -                        break;
 -
 -                    case "9.00":
 -                        version = "VC80";
 -                        break;
 -                
 -                    case "10.00":
 -                        version = "VC90";
 -                        break;
 -
 -                    case "11.00":
 -                        version = "VC100";
 -                        break;
 -
 -                    case "12.00":
 -                        version = "VC150";
 -                        break;
 -
 -                    default:
 -                        throw new ApplicationException("Unknown .sln version: " + format);
 -                }
 -            }
 -            finally
 -            {
 -                if(solutionStreamReader != null) 
 -                {
 -                    solutionStreamReader.Close();
 -                }
 -            }
 -            
 -            return version;
 -        }
 -
 -        public static string GetVSProgID(string version)
 -        {
 -            string progid = null;
 -            switch(version)
 -            {
 -                case "VC70":
 -                    progid = "VisualStudio.DTE.7";
 -                    break;
 -
 -                case "VC71":
 -                    progid = "VisualStudio.DTE.7.1";
 -                    break;
 -
 -                case "VC80":
 -                    progid = "VisualStudio.DTE.8.0";
 -                    break;
 -                
 -                case "VC90":
 -                    progid = "VisualStudio.DTE.9.0";
 -                    break;
 -
 -                case "VC100":
 -                    progid = "VisualStudio.DTE.10.0";
 -                    break;
 -
 -                case "VC120":
 -                    progid = "VisualStudio.DTE.12.0";
 -                    break;
 -
 -                case "VC150":
 -                    progid = "VisualStudio.DTE.15.0";
 -                    break;
 -
 -                default:
 -                    throw new ApplicationException("Can't handle VS version: " + version);
 -            }
 -
 -            return progid;
 -        }
 -
 -        public static bool SetProjectWorkingDir(object sol, string project_name, string working_dir)
 -        {
 -            bool made_change = false;
 -            Console.WriteLine("Looking for project {0}...", project_name);
 -            try
 -            {
 -                object prjs = ViaCOM.GetProperty(sol, "Projects");
 -                object count = ViaCOM.GetProperty(prjs, "Count");
 -                for(int i = 1; i <= (int)count; ++i)
 -                {
 -                    object[] prjItemArgs = { (object)i };
 -                    object prj = ViaCOM.CallMethod(prjs, "Item", prjItemArgs);
 -                    string name = (string)ViaCOM.GetProperty(prj, "Name");
 -                    if (0 == string.Compare(name, project_name, ignore_case))
 -                    {
 -                        Console.WriteLine("Found project: {0}", project_name);
 -                        Console.WriteLine("Setting working directory");
 -
 -                        string full_project_name = (string)ViaCOM.GetProperty(prj, "FullName");
 -                        Console.WriteLine(full_project_name);
 -
 -                        // *NOTE:Mani Thanks to incompatibilities between different versions of the 
 -                        // VCProjectEngine.dll assembly, we can't cast the objects recevied from the DTE to
 -                        // the VCProjectEngine types from a different version than the one built 
 -                        // with. ie, VisualStudio.DTE.7.1 objects can't be converted in a project built 
 -                        // in VS 8.0. To avoid this problem, we can use the com object interfaces directly, 
 -                        // without the type casting. Its tedious code, but it seems to work.
 -
 -                        // oCfgs should be assigned to a 'Project.Configurations' collection.
 -                        object oCfgs = ViaCOM.GetProperty(ViaCOM.GetProperty(prj, "Object"), "Configurations");
 -
 -                        // oCount will be assigned to the number of configs present in oCfgs.
 -                        object oCount = ViaCOM.GetProperty(oCfgs, "Count");
 -
 -                        for (int cfgIndex = 1; cfgIndex <= (int)oCount; ++cfgIndex)
 -                        {
 -                            object[] itemArgs = {(object)cfgIndex};
 -                            object oCfg = ViaCOM.CallMethod(oCfgs, "Item", itemArgs);
 -                            object oDebugSettings = ViaCOM.GetProperty(oCfg, "DebugSettings");
 -                            ViaCOM.SetProperty(oDebugSettings, "WorkingDirectory", (object)working_dir);
 -                        }
 -
 -                        break;
 -                    }
 -                }
 -                made_change = true;
 -            }
 -            catch( Exception e )
 -            {
 -                Console.WriteLine(e.Message);
 -                Console.WriteLine("Failed to set working dir for project, {0}.", project_name);
 -            }
 -
 -            return made_change;
 -        }
 -
 -        public static bool SetStartupProject(string startup_project)
 -        {
 -            bool result = false;
 -            try
 -            {
 -                // You need the 'unique name of the project to set StartupProjects.
 -                // find the project by generic name.
 -                Console.WriteLine("Trying to set \"{0}\" to the startup project", startup_project);
 -                object prjs = ViaCOM.GetProperty(solution, "Projects");
 -                object count = ViaCOM.GetProperty(prjs, "Count");
 -                for (int i = 1; i <= (int)count; ++i)
 -                {
 -                    object[] itemArgs = { (object)i };
 -                    object prj = ViaCOM.CallMethod(prjs, "Item", itemArgs);
 -                    object prjName = ViaCOM.GetProperty(prj, "Name");
 -                    if (0 == string.Compare((string)prjName, startup_project, ignore_case))
 -                    {
 -                        object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild");
 -                        ViaCOM.SetProperty(solBuild, "StartupProjects", ViaCOM.GetProperty(prj, "UniqueName"));
 -                        Console.WriteLine("  Success!");
 -                        result = true;
 -                        break;
 -                    }
 -                }
 -
 -                if (result == false)
 -                {
 -                    Console.WriteLine("  Could not find project \"{0}\" in the solution.", startup_project);
 -                }
 -            }
 -            catch (Exception e)
 -            {
 -                Console.WriteLine("  Failed to set the startup project!");
 -                Console.WriteLine(e.Message);
 -            }
 -            return result;
 -        }
 -
 -        public static bool SetActiveConfig(string config)
 -        {
 -            bool result = false;
 -            try
 -            {
 -                Console.WriteLine("Trying to set active config to \"{0}\"", config);
 -                object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild");
 -                object solCfgs = ViaCOM.GetProperty(solBuild, "SolutionConfigurations");
 -                object[] itemArgs = { (object)config };
 -                object solCfg = ViaCOM.CallMethod(solCfgs, "Item", itemArgs);
 -                ViaCOM.CallMethod(solCfg, "Activate", null);
 -                Console.WriteLine("  Success!");
 -                result = true;
 -            }
 -            catch (Exception e)
 -            {
 -                Console.WriteLine("  Failed to set \"{0}\" as the active config.", config);
 -                Console.WriteLine(e.Message);
 -            }
 -            return result;
 -        }
 -    }
 -}
 diff --git a/indra/win_crash_logger/README.txt b/indra/win_crash_logger/README.txt deleted file mode 100644 index 6932a8d9c3..0000000000 --- a/indra/win_crash_logger/README.txt +++ /dev/null @@ -1,3 +0,0 @@ -This component is no longer used in Linden Lab builds. -Change requests to support continued use by open source -builds are welcome. diff --git a/scripts/packages-formatter.py b/scripts/packages-formatter.py index 4449111e46..5d31702e76 100755 --- a/scripts/packages-formatter.py +++ b/scripts/packages-formatter.py @@ -42,7 +42,7 @@ _autobuild_env=os.environ.copy()  # Coerce stdout encoding to utf-8 as cygwin's will be detected as cp1252 otherwise.  _autobuild_env["PYTHONIOENCODING"] = "utf-8" -pkg_line=re.compile('^([\w-]+):\s+(.*)$') +pkg_line=re.compile(r'^([\w-]+):\s+(.*)$')  def autobuild(*args):      """  | 
