diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llsyntaxid.cpp | 139 | ||||
| -rw-r--r-- | indra/newview/llsyntaxid.h | 10 | 
2 files changed, 74 insertions, 75 deletions
diff --git a/indra/newview/llsyntaxid.cpp b/indra/newview/llsyntaxid.cpp index 802dff1ead..fbb800f881 100644 --- a/indra/newview/llsyntaxid.cpp +++ b/indra/newview/llsyntaxid.cpp @@ -34,67 +34,9 @@  #include "llhttpclient.h"  #include "llsdserialize.h"  #include "llviewerregion.h" +#include "llcorehttputil.h"  //----------------------------------------------------------------------------- -// fetchKeywordsFileResponder -//----------------------------------------------------------------------------- -class fetchKeywordsFileResponder : public LLHTTPClient::Responder -{ -public: -	fetchKeywordsFileResponder(const std::string& filespec) -	: mFileSpec(filespec) -	{ -		LL_DEBUGS("SyntaxLSL") << "Instantiating with file saving to: '" << filespec << "'" << LL_ENDL; -	} - -	/* virtual */ void httpFailure() -	{ -		LL_WARNS("SyntaxLSL") << "failed to fetch syntax file [status:" << getStatus() << "]: " << getContent() << LL_ENDL; -	} - -	/* virtual */ void httpSuccess() -	{ -		// Continue only if a valid LLSD object was returned. -		const LLSD& content = getContent(); -		if (content.isMap()) -		{ -			if (LLSyntaxIdLSL::getInstance()->isSupportedVersion(content)) -			{ -				LLSyntaxIdLSL::getInstance()->setKeywordsXml(content); - -				cacheFile(content); -				LLSyntaxIdLSL::getInstance()->handleFileFetched(mFileSpec); -			} -			else -			{ -				LL_WARNS("SyntaxLSL") << "Unknown or unsupported version of syntax file." << LL_ENDL; -			} -		} -		else -		{ -			LL_WARNS("SyntaxLSL") << "Syntax file '" << mFileSpec << "' contains invalid LLSD." << LL_ENDL; -		} -	} - -	void cacheFile(const LLSD& content_ref) -	{ -		std::stringstream str; -		LLSDSerialize::toXML(content_ref, str); -		const std::string xml = str.str(); - -		// save the str to disk, usually to the cache. -		llofstream file(mFileSpec.c_str(), std::ios_base::out); -		file.write(xml.c_str(), str.str().size()); -		file.close(); - -		LL_DEBUGS("SyntaxLSL") << "Syntax file received, saving as: '" << mFileSpec << "'" << LL_ENDL; -	} -	 -private: -	std::string mFileSpec; -}; -	 -//-----------------------------------------------------------------------------  // LLSyntaxIdLSL  //-----------------------------------------------------------------------------  const std::string SYNTAX_ID_CAPABILITY_NAME = "LSLSyntax"; @@ -166,13 +108,72 @@ bool LLSyntaxIdLSL::syntaxIdChanged()  //-----------------------------------------------------------------------------  void LLSyntaxIdLSL::fetchKeywordsFile(const std::string& filespec)  { -	mInflightFetches.push_back(filespec); -	LLHTTPClient::get(mCapabilityURL, -					  new fetchKeywordsFileResponder(filespec), -					  LLSD(), 30.f); +    LLCoros::instance().launch("LLSyntaxIdLSL::fetchKeywordsFileCoro", +        boost::bind(&LLSyntaxIdLSL::fetchKeywordsFileCoro, this, _1, mCapabilityURL, filespec));  	LL_DEBUGS("SyntaxLSL") << "LSLSyntaxId capability URL is: " << mCapabilityURL << ". Filename to use is: '" << filespec << "'." << LL_ENDL;  } +//----------------------------------------------------------------------------- +// fetchKeywordsFileCoro +//----------------------------------------------------------------------------- +void LLSyntaxIdLSL::fetchKeywordsFileCoro(LLCoros::self& self, std::string url, std::string fileSpec) +{ +    LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); +    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t +        httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy)); +    LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + +    std::pair<std::set<std::string>::iterator, bool> insrt = mInflightFetches.insert(fileSpec); +    if (!insrt.second) +    { +        LL_WARNS("SyntaxLSL") << "Already downloading keyword file called \"" << fileSpec << "\"." << LL_ENDL; +        return; +    } + +    LLSD result = httpAdapter->getAndYield(self, httpRequest, url); + +    LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; +    LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + +    mInflightFetches.erase(fileSpec); + +    if (!status) +    { +        LL_WARNS("SyntaxLSL") << "Failed to fetch syntax file \"" << fileSpec << "\"" << LL_ENDL; +        return; +    } + +    result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); + +    if (isSupportedVersion(result)) +    { +        setKeywordsXml(result); +        cacheFile(fileSpec, result); +        loadKeywordsIntoLLSD(); +    } +    else +    { +        LL_WARNS("SyntaxLSL") << "Unknown or unsupported version of syntax file." << LL_ENDL; +    } + +} + +//----------------------------------------------------------------------------- +// cacheFile +//----------------------------------------------------------------------------- +void LLSyntaxIdLSL::cacheFile(const std::string &fileSpec, const LLSD& content_ref) +{ +    std::stringstream str; +    LLSDSerialize::toXML(content_ref, str); +    const std::string xml = str.str(); + +    // save the str to disk, usually to the cache. +    llofstream file(fileSpec.c_str(), std::ios_base::out); +    file.write(xml.c_str(), str.str().size()); +    file.close(); + +    LL_DEBUGS("SyntaxLSL") << "Syntax file received, saving as: '" << fileSpec << "'" << LL_ENDL; +}  //-----------------------------------------------------------------------------  // initialize @@ -260,8 +261,8 @@ void LLSyntaxIdLSL::loadDefaultKeywordsIntoLLSD()  // loadKeywordsFileIntoLLSD  //-----------------------------------------------------------------------------  /** - * @brief	Load xml serialised LLSD - * @desc	Opens the specified filespec and attempts to deserialise the + * @brief	Load xml serialized LLSD + * @desc	Opens the specified filespec and attempts to deserializes the   *			contained data to the specified LLSD object. indicate success/failure with   *			sLoaded/sLoadFailed members.   */ @@ -276,7 +277,7 @@ void LLSyntaxIdLSL::loadKeywordsIntoLLSD()  		{  			if (isSupportedVersion(content))  			{ -				LL_DEBUGS("SyntaxLSL") << "Deserialised: " << mFullFileSpec << LL_ENDL; +				LL_DEBUGS("SyntaxLSL") << "Deserialized: " << mFullFileSpec << LL_ENDL;  			}  			else  			{ @@ -317,12 +318,6 @@ void LLSyntaxIdLSL::handleCapsReceived(const LLUUID& region_uuid)  	}  } -void LLSyntaxIdLSL::handleFileFetched(const std::string& filepath) -{ -	mInflightFetches.remove(filepath); -	loadKeywordsIntoLLSD(); -} -  boost::signals2::connection LLSyntaxIdLSL::addSyntaxIDCallback(const syntax_id_changed_signal_t::slot_type& cb)  {  	return mSyntaxIDChangedSignal.connect(cb); diff --git a/indra/newview/llsyntaxid.h b/indra/newview/llsyntaxid.h index 504fb0997e..47de94cea2 100644 --- a/indra/newview/llsyntaxid.h +++ b/indra/newview/llsyntaxid.h @@ -31,6 +31,8 @@  #include "llviewerprecompiledheaders.h"  #include "llsingleton.h" +#include "lleventcoro.h" +#include "llcoros.h"  class fetchKeywordsFileResponder; @@ -40,7 +42,7 @@ class LLSyntaxIdLSL : public LLSingleton<LLSyntaxIdLSL>  	friend class fetchKeywordsFileResponder;  private: -	std::list<std::string> mInflightFetches; +    std::set<std::string> mInflightFetches;  	typedef boost::signals2::signal<void()> syntax_id_changed_signal_t;  	syntax_id_changed_signal_t mSyntaxIDChangedSignal;  	boost::signals2::connection mRegionChangedCallback; @@ -49,13 +51,15 @@ private:  	bool	isSupportedVersion(const LLSD& content);  	void	handleRegionChanged();  	void	handleCapsReceived(const LLUUID& region_uuid); -	void	handleFileFetched(const std::string& filepath);  	void	setKeywordsXml(const LLSD& content) { mKeywordsXml = content; };  	void	buildFullFileSpec();  	void	fetchKeywordsFile(const std::string& filespec);  	void	loadDefaultKeywordsIntoLLSD();  	void	loadKeywordsIntoLLSD(); -	 + +    void    fetchKeywordsFileCoro(LLCoros::self& self, std::string url, std::string fileSpec); +    void    cacheFile(const std::string &fileSpec, const LLSD& content_ref); +  	std::string		mCapabilityURL;  	std::string		mFullFileSpec;  	ELLPath			mFilePath;  | 
