diff options
| author | Rider Linden <rider@lindenlab.com> | 2015-06-03 13:51:45 -0700 | 
|---|---|---|
| committer | Rider Linden <rider@lindenlab.com> | 2015-06-03 13:51:45 -0700 | 
| commit | 2f0e3de43eafc4aeab75b648ecdc0c275ac368f5 (patch) | |
| tree | b0f5e6df6d780ecbb57809150410d40876d5cb93 | |
| parent | dcd364022435ed7dc7458b83a4d3b42a0b777b11 (diff) | |
Land Media URL entry to coroutine.
| -rwxr-xr-x | indra/newview/llfloaterurlentry.cpp | 88 | ||||
| -rwxr-xr-x | indra/newview/llfloaterurlentry.h | 7 | 
2 files changed, 61 insertions, 34 deletions
| diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index e02e8eeb5a..1e58f6c6ec 100755 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -40,40 +40,10 @@  #include "lluictrlfactory.h"  #include "llwindow.h"  #include "llviewerwindow.h" +#include "llcorehttputil.h"  static LLFloaterURLEntry* sInstance = NULL; -// Move this to its own file. -// helper class that tries to download a URL from a web site and calls a method -// on the Panel Land Media and to discover the MIME type -class LLMediaTypeResponder : public LLHTTPClient::Responder -{ -	LOG_CLASS(LLMediaTypeResponder); -public: -	LLMediaTypeResponder( const LLHandle<LLFloater> parent ) : -		mParent( parent ) -	{} - -	LLHandle<LLFloater> mParent; - -private: -	/* virtual */ void httpCompleted() -	{ -		const std::string& media_type = getResponseHeader(HTTP_IN_HEADER_CONTENT_TYPE); -		std::string::size_type idx1 = media_type.find_first_of(";"); -		std::string mime_type = media_type.substr(0, idx1); - -		// Set empty type to none/none.  Empty string is reserved for legacy parcels -		// which have no mime type set. -		std::string resolved_mime_type = ! mime_type.empty() ? mime_type : LLMIMETypes::getDefaultMimeType(); -		LLFloaterURLEntry* floater_url_entry = (LLFloaterURLEntry*)mParent.get(); -		if ( floater_url_entry ) -		{ -			floater_url_entry->headerFetchComplete( getStatus(), resolved_mime_type ); -		} -	} -}; -  //-----------------------------------------------------------------------------  // LLFloaterURLEntry()  //----------------------------------------------------------------------------- @@ -225,8 +195,8 @@ void LLFloaterURLEntry::onBtnOK( void* userdata )  	if(!media_url.empty() &&   	   (scheme == "http" || scheme == "https"))  	{ -		LLHTTPClient::getHeaderOnly( media_url, -			new LLMediaTypeResponder(self->getHandle())); +        LLCoros::instance().launch("LLFloaterURLEntry::getMediaTypeCoro", +            boost::bind(&LLFloaterURLEntry::getMediaTypeCoro, _1, media_url, self->getHandle()));  	}  	else  	{ @@ -240,6 +210,58 @@ void LLFloaterURLEntry::onBtnOK( void* userdata )  }  // static +void LLFloaterURLEntry::getMediaTypeCoro(LLCoros::self& self, std::string url, LLHandle<LLFloater> parentHandle) +{ +    LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); +    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t +        httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getMediaTypeCoro", httpPolicy)); +    LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); +    LLCore::HttpOptions::ptr_t httpOpts = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); + +    httpOpts->setHeadersOnly(true); + +    LL_INFOS("HttpCoroutineAdapter", "genericPostCoro") << "Generic POST for " << url << LL_ENDL; + +    LLSD result = httpAdapter->getAndYield(self, httpRequest, url, httpOpts); + +    LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; +    LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + +    LLFloaterURLEntry* floaterUrlEntry = (LLFloaterURLEntry*)parentHandle.get(); +    if (!floaterUrlEntry) +    { +        LL_WARNS() << "Could not get URL entry floater." << LL_ENDL; +        return; +    } + +    // Set empty type to none/none.  Empty string is reserved for legacy parcels +    // which have no mime type set. +    std::string resolvedMimeType = LLMIMETypes::getDefaultMimeType(); + +    if (!status) +    { +        floaterUrlEntry->headerFetchComplete(status.getType(), resolvedMimeType); +        return; +    } + +    LLSD resultHeaders = httpResults[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_HEADERS]; + +    if (resultHeaders.has(HTTP_IN_HEADER_CONTENT_TYPE)) +    { +        const std::string& mediaType = resultHeaders[HTTP_IN_HEADER_CONTENT_TYPE]; +        std::string::size_type idx1 = mediaType.find_first_of(";"); +        std::string mimeType = mediaType.substr(0, idx1); +        if (!mimeType.empty()) +        { +            resolvedMimeType = mimeType; +        } +    } + +    floaterUrlEntry->headerFetchComplete(status.getType(), resolvedMimeType); + +} + +// static  //-----------------------------------------------------------------------------  // onBtnCancel()  //----------------------------------------------------------------------------- diff --git a/indra/newview/llfloaterurlentry.h b/indra/newview/llfloaterurlentry.h index bdd1ebe592..2f5afa653d 100755 --- a/indra/newview/llfloaterurlentry.h +++ b/indra/newview/llfloaterurlentry.h @@ -29,6 +29,8 @@  #include "llfloater.h"  #include "llpanellandmedia.h" +#include "lleventcoro.h" +#include "llcoros.h"  class LLLineEditor;  class LLComboBox; @@ -56,7 +58,10 @@ private:  	static void		onBtnOK(void*);  	static void		onBtnCancel(void*);  	static void		onBtnClear(void*); -	bool		callback_clear_url_list(const LLSD& notification, const LLSD& response); +	bool		    callback_clear_url_list(const LLSD& notification, const LLSD& response); + +    static void     getMediaTypeCoro(LLCoros::self& self, std::string url, LLHandle<LLFloater> parentHandle); +  };  #endif  // LL_LLFLOATERURLENTRY_H | 
