diff options
| author | Andrew A. de Laix <alain@lindenlab.com> | 2010-11-02 15:59:10 -0700 | 
|---|---|---|
| committer | Andrew A. de Laix <alain@lindenlab.com> | 2010-11-02 15:59:10 -0700 | 
| commit | be151807222ffa5972256aa9a392e8a319eae5ee (patch) | |
| tree | c49ffe17811a5841bb8ad7f2e30f45e06adb2b4f /indra/viewer_components/updater | |
| parent | 36b8b88153180f637c24709dc94739b5f4c4367e (diff) | |
start of the downloader service.
Diffstat (limited to 'indra/viewer_components/updater')
| -rw-r--r-- | indra/viewer_components/updater/CMakeLists.txt | 8 | ||||
| -rw-r--r-- | indra/viewer_components/updater/llupdatedownloader.cpp | 168 | ||||
| -rw-r--r-- | indra/viewer_components/updater/llupdatedownloader.h | 73 | 
3 files changed, 249 insertions, 0 deletions
| diff --git a/indra/viewer_components/updater/CMakeLists.txt b/indra/viewer_components/updater/CMakeLists.txt index 2e77a7140a..64a0f98c2a 100644 --- a/indra/viewer_components/updater/CMakeLists.txt +++ b/indra/viewer_components/updater/CMakeLists.txt @@ -6,24 +6,30 @@ include(00-Common)  if(LL_TESTS)    include(LLAddBuildTest)  endif(LL_TESTS) +include(CURL)  include(LLCommon)  include(LLMessage)  include(LLPlugin) +include(LLVFS)  include_directories(      ${LLCOMMON_INCLUDE_DIRS}      ${LLMESSAGE_INCLUDE_DIRS}      ${LLPLUGIN_INCLUDE_DIRS} +	${LLVFS_INCLUDE_DIRS} +	${CURL_INCLUDE_DIRS}      )  set(updater_service_SOURCE_FILES      llupdaterservice.cpp      llupdatechecker.cpp +    llupdatedownloader.cpp      )  set(updater_service_HEADER_FILES      llupdaterservice.h      llupdatechecker.h +    llupdatedownloader.h      )  set_source_files_properties(${updater_service_HEADER_FILES} @@ -42,6 +48,8 @@ target_link_libraries(llupdaterservice      ${LLCOMMON_LIBRARIES}      ${LLMESSAGE_LIBRARIES}      ${LLPLUGIN_LIBRARIES} +	${LLVFS_LIBRARIES} +	${CURL_LIBRARIES}      )  if(LL_TESTS) diff --git a/indra/viewer_components/updater/llupdatedownloader.cpp b/indra/viewer_components/updater/llupdatedownloader.cpp new file mode 100644 index 0000000000..4adf9c42b1 --- /dev/null +++ b/indra/viewer_components/updater/llupdatedownloader.cpp @@ -0,0 +1,168 @@ +/**  + * @file llupdatedownloader.cpp + * + * $LicenseInfo:firstyear=2010&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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 "linden_common.h" +#include "lldir.h" +#include "llfile.h" +#include "llsd.h" +#include "llsdserialize.h" +#include "llthread.h" +#include "llupdatedownloader.h" + + +class LLUpdateDownloader::Implementation: +	public LLThread +{ +public: +	Implementation(LLUpdateDownloader::Client & client); +	void cancel(void); +	void download(LLURI const & uri); +	bool isDownloading(void); + +private: +	static const char * sSecondLifeUpdateRecord; +	 +	LLUpdateDownloader::Client & mClient; +	std::string mDownloadRecordPath; +	 +	void resumeDownloading(LLSD const & downloadData); +	void run(void); +	bool shouldResumeOngoingDownload(LLURI const & uri, LLSD & downloadData); +	void startDownloading(LLURI const & uri); +}; + + + +// LLUpdateDownloader +//----------------------------------------------------------------------------- + + +LLUpdateDownloader::LLUpdateDownloader(Client & client): +	mImplementation(new LLUpdateDownloader::Implementation(client)) +{ +	; // No op. +} + + +void LLUpdateDownloader::cancel(void) +{ +	mImplementation->cancel(); +} + + +void LLUpdateDownloader::download(LLURI const & uri) +{ +	mImplementation->download(uri); +} + + +bool LLUpdateDownloader::isDownloading(void) +{ +	return mImplementation->isDownloading(); +} + + + +// LLUpdateDownloader::Implementation +//----------------------------------------------------------------------------- + + +const char * LLUpdateDownloader::Implementation::sSecondLifeUpdateRecord = +	"SecondLifeUpdateDownload.xml"; + + +LLUpdateDownloader::Implementation::Implementation(LLUpdateDownloader::Client & client): +	LLThread("LLUpdateDownloader"), +	mClient(client), +	mDownloadRecordPath(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, sSecondLifeUpdateRecord)) +{ +	; // No op. +} + + +void LLUpdateDownloader::Implementation::cancel(void) +{ +} + + +void LLUpdateDownloader::Implementation::download(LLURI const & uri) +{ +	LLSD downloadData; +	if(shouldResumeOngoingDownload(uri, downloadData)){ +		 +	} else { +					 +	} +} + + +bool LLUpdateDownloader::Implementation::isDownloading(void) +{ +	return false; +} + + +void resumeDownloading(LLSD const & downloadData) +{ +} + + +bool LLUpdateDownloader::Implementation::shouldResumeOngoingDownload(LLURI const & uri, LLSD & downloadData) +{ +	if(!LLFile::isfile(mDownloadRecordPath)) return false; +	 +	llifstream dataStream(mDownloadRecordPath); +	LLSDSerialize parser; +	parser.fromXMLDocument(downloadData, dataStream); +	 +	if(downloadData["url"].asString() != uri.asString()) return false; +	 +	std::string downloadedFilePath = downloadData["path"].asString(); +	if(LLFile::isfile(downloadedFilePath)) { +		llstat fileStatus; +		LLFile::stat(downloadedFilePath, &fileStatus); +		downloadData["bytes_downloaded"] = LLSD(LLSD::Integer(fileStatus.st_size));  +		return true; +	} else { +		return false; +	} + +	return true; +} + + +void LLUpdateDownloader::Implementation::startDownloading(LLURI const & uri) +{ +	LLSD downloadData; +	downloadData["url"] = uri.asString(); +	LLSD path = uri.pathArray(); +	std::string fileName = path[path.size() - 1].asString(); +	std::string filePath = gDirUtilp->getExpandedFilename(LL_PATH_TEMP, fileName); +	llofstream dataStream(mDownloadRecordPath); +	LLSDSerialize parser; +	parser.toPrettyXML(downloadData, dataStream); +	 +	llofstream downloadStream(filePath); +} diff --git a/indra/viewer_components/updater/llupdatedownloader.h b/indra/viewer_components/updater/llupdatedownloader.h new file mode 100644 index 0000000000..9dc5d789ce --- /dev/null +++ b/indra/viewer_components/updater/llupdatedownloader.h @@ -0,0 +1,73 @@ +/**  + * @file llupdatedownloader.h + * + * $LicenseInfo:firstyear=2010&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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$ + */ + +#ifndef LL_UPDATE_DOWNLOADER_H +#define LL_UPDATE_DOWNLOADER_H + + +#include <string> +#include <boost/shared_ptr.hpp> +#include "lluri.h" + + +// +// An asynchronous download service for fetching updates. +// +class LLUpdateDownloader +{ +public: +	class Client; +	class Implementation; +	 +	LLUpdateDownloader(Client & client); +	 +	// Cancel any in progress download. +	void cancel(void); +	 +	// Start a new download. +	void download(LLURI const & uri); +	 +	// Returns true if a download is in progress. +	bool isDownloading(void); +	 +private: +	boost::shared_ptr<Implementation> mImplementation; +}; + + +// +// An interface to be implemented by clients initiating a update download. +// +class LLUpdateDownloader::Client { +	 +	// The download has completed successfully. +	void downloadComplete(void); +	 +	// The download failed. +	void downloadError(std::string const & message); +}; + + +#endif
\ No newline at end of file | 
