summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew A. de Laix <alain@lindenlab.com>2010-11-04 14:08:38 -0700
committerAndrew A. de Laix <alain@lindenlab.com>2010-11-04 14:08:38 -0700
commit070fe9ed262da5c990a5129474489647a0369fc9 (patch)
treea7fdd231cc6e84065152048bc5671d428706d801
parente0c734a7105060740e5597d4439d882bb3f2bff4 (diff)
parentdfeb7abe5f690bbd3a908c84c53bbea20a5adb7c (diff)
Automated merge with https://bitbucket.org/mani_linden/viewer-development/
-rw-r--r--indra/newview/app_settings/settings.xml24
-rw-r--r--indra/newview/llappviewer.cpp4
-rw-r--r--indra/viewer_components/updater/CMakeLists.txt8
-rw-r--r--indra/viewer_components/updater/llupdatechecker.cpp60
-rw-r--r--indra/viewer_components/updater/llupdatechecker.h10
-rw-r--r--indra/viewer_components/updater/llupdatedownloader.cpp281
-rw-r--r--indra/viewer_components/updater/llupdatedownloader.h79
-rw-r--r--indra/viewer_components/updater/llupdaterservice.cpp62
-rw-r--r--indra/viewer_components/updater/llupdaterservice.h6
-rw-r--r--indra/viewer_components/updater/tests/llupdaterservice_test.cpp13
10 files changed, 494 insertions, 53 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 8f5cb7c709..cc0e0a78db 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11022,7 +11022,29 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://localhost/agni</string>
+ <string>http://update.secondlife.com</string>
+ </map>
+ <key>UpdaterServicePath</key>
+ <map>
+ <key>Comment</key>
+ <string>Path on the update server host.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>update</string>
+ </map>
+ <key>UpdaterServiceProtocolVersion</key>
+ <map>
+ <key>Comment</key>
+ <string>The update protocol version to use.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>v1.0</string>
</map>
<key>UploadBakedTexOld</key>
<map>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 3a48bc25f1..6bb25969a6 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -2337,9 +2337,11 @@ void LLAppViewer::initUpdater()
std::string url = gSavedSettings.getString("UpdaterServiceURL");
std::string channel = LLVersionInfo::getChannel();
std::string version = LLVersionInfo::getVersion();
+ std::string protocol_version = gSavedSettings.getString("UpdaterServiceProtocolVersion");
+ std::string service_path = gSavedSettings.getString("UpdaterServicePath");
U32 check_period = gSavedSettings.getU32("UpdaterServiceCheckPeriod");
- mUpdater->setParams(url, channel, version);
+ mUpdater->setParams(protocol_version, url, service_path, channel, version);
mUpdater->setCheckPeriod(check_period);
if(gSavedSettings.getBOOL("UpdaterServiceActive"))
{
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/llupdatechecker.cpp b/indra/viewer_components/updater/llupdatechecker.cpp
index 331d0269d4..2c60636122 100644
--- a/indra/viewer_components/updater/llupdatechecker.cpp
+++ b/indra/viewer_components/updater/llupdatechecker.cpp
@@ -41,7 +41,8 @@ public:
Implementation(Client & client);
~Implementation();
- void check(std::string const & host, std::string channel, std::string version);
+ void check(std::string const & protocolVersion, std::string const & hostUrl,
+ std::string const & servicePath, std::string channel, std::string version);
// Responder:
virtual void completed(U32 status,
@@ -50,12 +51,13 @@ public:
virtual void error(U32 status, const std::string & reason);
private:
- std::string buildUrl(std::string const & host, std::string channel, std::string version);
+ std::string buildUrl(std::string const & protocolVersion, std::string const & hostUrl,
+ std::string const & servicePath, std::string channel, std::string version);
Client & mClient;
LLHTTPClient mHttpClient;
bool mInProgress;
- LLHTTPClient::ResponderPtr mMe;
+ LLHTTPClient::ResponderPtr mMe;
std::string mVersion;
LOG_CLASS(LLUpdateChecker::Implementation);
@@ -74,9 +76,10 @@ LLUpdateChecker::LLUpdateChecker(LLUpdateChecker::Client & client):
}
-void LLUpdateChecker::check(std::string const & host, std::string channel, std::string version)
+void LLUpdateChecker::check(std::string const & protocolVersion, std::string const & hostUrl,
+ std::string const & servicePath, std::string channel, std::string version)
{
- mImplementation->check(host, channel, version);
+ mImplementation->check(protocolVersion, hostUrl, servicePath, channel, version);
}
@@ -100,14 +103,20 @@ LLUpdateChecker::Implementation::~Implementation()
}
-void LLUpdateChecker::Implementation::check(std::string const & host, std::string channel, std::string version)
+void LLUpdateChecker::Implementation::check(std::string const & protocolVersion, std::string const & hostUrl,
+ std::string const & servicePath, std::string channel, std::string version)
{
// llassert(!mInProgress);
mInProgress = true;
mVersion = version;
- std::string checkUrl = buildUrl(host, channel, version);
+ std::string checkUrl = buildUrl(protocolVersion, hostUrl, servicePath, channel, version);
LL_INFOS("UpdateCheck") << "checking for updates at " << checkUrl << llendl;
+
+ // The HTTP client will wrap a raw pointer in a boost::intrusive_ptr causing the
+ // passed object to be silently and automatically deleted. We pass a self-
+ // referential intrusive pointer stored as an attribute of this class to keep
+ // the client from deletig the update checker implementation instance.
mHttpClient.get(checkUrl, mMe);
}
@@ -115,20 +124,22 @@ void LLUpdateChecker::Implementation::completed(U32 status,
const std::string & reason,
const LLSD & content)
{
- mInProgress = false;
+ mInProgress = false;
if(status != 200) {
LL_WARNS("UpdateCheck") << "html error " << status << " (" << reason << ")" << llendl;
mClient.error(reason);
- } else if(!content["valid"].asBoolean()) {
- LL_INFOS("UpdateCheck") << "version invalid" << llendl;
- mClient.requiredUpdate(content["latest_version"].asString());
- } else if(content["latest_version"].asString() != mVersion) {
- LL_INFOS("UpdateCheck") << "newer version " << content["latest_version"].asString() << " available" << llendl;
- mClient.optionalUpdate(content["latest_version"].asString());
- } else {
+ } else if(!content.asBoolean()) {
LL_INFOS("UpdateCheck") << "up to date" << llendl;
mClient.upToDate();
+ } else if(content["required"].asBoolean()) {
+ LL_INFOS("UpdateCheck") << "version invalid" << llendl;
+ LLURI uri(content["url"].asString());
+ mClient.requiredUpdate(content["version"].asString(), uri);
+ } else {
+ LL_INFOS("UpdateCheck") << "newer version " << content["version"].asString() << " available" << llendl;
+ LLURI uri(content["url"].asString());
+ mClient.optionalUpdate(content["version"].asString(), uri);
}
}
@@ -137,15 +148,26 @@ void LLUpdateChecker::Implementation::error(U32 status, const std::string & reas
{
mInProgress = false;
LL_WARNS("UpdateCheck") << "update check failed; " << reason << llendl;
+ mClient.error(reason);
}
-std::string LLUpdateChecker::Implementation::buildUrl(std::string const & host, std::string channel, std::string version)
+std::string LLUpdateChecker::Implementation::buildUrl(std::string const & protocolVersion, std::string const & hostUrl,
+ std::string const & servicePath, std::string channel, std::string version)
{
+#ifdef LL_WINDOWS
+ static const char * platform = "win";
+#elif LL_DARWIN
+ static const char * platform = "mac";
+#else
+ static const char * platform = "lnx";
+#endif
+
LLSD path;
- path.append("version");
+ path.append(servicePath);
+ path.append(protocolVersion);
path.append(channel);
path.append(version);
- return LLURI::buildHTTP(host, path).asString();
+ path.append(platform);
+ return LLURI::buildHTTP(hostUrl, path).asString();
}
-
diff --git a/indra/viewer_components/updater/llupdatechecker.h b/indra/viewer_components/updater/llupdatechecker.h
index b630c4d8a6..58aaee4e3d 100644
--- a/indra/viewer_components/updater/llupdatechecker.h
+++ b/indra/viewer_components/updater/llupdatechecker.h
@@ -41,13 +41,17 @@ public:
LLUpdateChecker(Client & client);
// Check status of current app on the given host for the channel and version provided.
- void check(std::string const & hostUrl, std::string channel, std::string version);
+ void check(std::string const & protocolVersion, std::string const & hostUrl,
+ std::string const & servicePath, std::string channel, std::string version);
private:
boost::shared_ptr<Implementation> mImplementation;
};
+class LLURI; // From lluri.h
+
+
//
// The client interface implemented by a requestor checking for an update.
//
@@ -58,10 +62,10 @@ public:
virtual void error(std::string const & message) = 0;
// A newer version is available, but the current version may still be used.
- virtual void optionalUpdate(std::string const & newVersion) = 0;
+ virtual void optionalUpdate(std::string const & newVersion, LLURI const & uri) = 0;
// A newer version is available, and the current version is no longer valid.
- virtual void requiredUpdate(std::string const & newVersion) = 0;
+ virtual void requiredUpdate(std::string const & newVersion, LLURI const & uri) = 0;
// The checked version is up to date; no newer version exists.
virtual void upToDate(void) = 0;
diff --git a/indra/viewer_components/updater/llupdatedownloader.cpp b/indra/viewer_components/updater/llupdatedownloader.cpp
new file mode 100644
index 0000000000..087d79f804
--- /dev/null
+++ b/indra/viewer_components/updater/llupdatedownloader.cpp
@@ -0,0 +1,281 @@
+/**
+ * @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 <boost/lexical_cast.hpp>
+#include <curl/curl.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);
+ ~Implementation();
+ void cancel(void);
+ void download(LLURI const & uri);
+ bool isDownloading(void);
+ void onHeader(void * header, size_t size);
+ void onBody(void * header, size_t size);
+private:
+ static const char * sSecondLifeUpdateRecord;
+
+ LLUpdateDownloader::Client & mClient;
+ CURL * mCurl;
+ llofstream mDownloadStream;
+ std::string mDownloadRecordPath;
+
+ void initializeCurlGet(std::string const & url);
+ void resumeDownloading(LLSD const & downloadData);
+ void run(void);
+ bool shouldResumeOngoingDownload(LLURI const & uri, LLSD & downloadData);
+ void startDownloading(LLURI const & uri);
+
+ LOG_CLASS(LLUpdateDownloader::Implementation);
+};
+
+
+
+// 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
+//-----------------------------------------------------------------------------
+
+
+namespace {
+ size_t write_function(void * data, size_t blockSize, size_t blocks, void * downloader)
+ {
+ size_t bytes = blockSize * blocks;
+ reinterpret_cast<LLUpdateDownloader::Implementation *>(downloader)->onBody(data, bytes);
+ return bytes;
+ }
+
+ size_t header_function(void * data, size_t blockSize, size_t blocks, void * downloader)
+ {
+ size_t bytes = blockSize * blocks;
+ reinterpret_cast<LLUpdateDownloader::Implementation *>(downloader)->onHeader(data, bytes);
+ return bytes;
+ }
+}
+
+
+const char * LLUpdateDownloader::Implementation::sSecondLifeUpdateRecord =
+ "SecondLifeUpdateDownload.xml";
+
+
+LLUpdateDownloader::Implementation::Implementation(LLUpdateDownloader::Client & client):
+ LLThread("LLUpdateDownloader"),
+ mClient(client),
+ mCurl(0),
+ mDownloadRecordPath(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, sSecondLifeUpdateRecord))
+{
+ CURLcode code = curl_global_init(CURL_GLOBAL_ALL); // Just in case.
+ llassert(code = CURLE_OK); // TODO: real error handling here.
+}
+
+
+LLUpdateDownloader::Implementation::~Implementation()
+{
+ if(mCurl) curl_easy_cleanup(mCurl);
+}
+
+
+void LLUpdateDownloader::Implementation::cancel(void)
+{
+ llassert(!"not implemented");
+}
+
+
+void LLUpdateDownloader::Implementation::download(LLURI const & uri)
+{
+ LLSD downloadData;
+ if(shouldResumeOngoingDownload(uri, downloadData)){
+ startDownloading(uri); // TODO: Implement resume.
+ } else {
+ startDownloading(uri);
+ }
+}
+
+
+bool LLUpdateDownloader::Implementation::isDownloading(void)
+{
+ return !isStopped();
+}
+
+void LLUpdateDownloader::Implementation::onHeader(void * buffer, size_t size)
+{
+ char const * headerPtr = reinterpret_cast<const char *> (buffer);
+ std::string header(headerPtr, headerPtr + size);
+ size_t colonPosition = header.find(':');
+ if(colonPosition == std::string::npos) return; // HTML response; ignore.
+
+ if(header.substr(0, colonPosition) == "Content-Length") {
+ try {
+ size_t firstDigitPos = header.find_first_of("0123456789", colonPosition);
+ size_t lastDigitPos = header.find_last_of("0123456789");
+ std::string contentLength = header.substr(firstDigitPos, lastDigitPos - firstDigitPos + 1);
+ size_t size = boost::lexical_cast<size_t>(contentLength);
+ LL_INFOS("UpdateDownload") << "download size is " << size << LL_ENDL;
+
+ LLSD downloadData;
+ llifstream idataStream(mDownloadRecordPath);
+ LLSDSerialize parser;
+ parser.fromXMLDocument(downloadData, idataStream);
+ idataStream.close();
+ downloadData["size"] = LLSD(LLSD::Integer(size));
+ llofstream odataStream(mDownloadRecordPath);
+ parser.toPrettyXML(downloadData, odataStream);
+ } catch (std::exception const & e) {
+ LL_WARNS("UpdateDownload") << "unable to read content length ("
+ << e.what() << ")" << LL_ENDL;
+ }
+ } else {
+ ; // No op.
+ }
+}
+
+
+void LLUpdateDownloader::Implementation::onBody(void * buffer, size_t size)
+{
+ mDownloadStream.write(reinterpret_cast<const char *>(buffer), size);
+}
+
+
+void LLUpdateDownloader::Implementation::run(void)
+{
+ CURLcode code = curl_easy_perform(mCurl);
+ if(code == CURLE_OK) {
+ LL_INFOS("UpdateDownload") << "download successful" << LL_ENDL;
+ mClient.downloadComplete();
+ } else {
+ LL_WARNS("UpdateDownload") << "download failed with error " << code << LL_ENDL;
+ mClient.downloadError("curl error");
+ }
+}
+
+
+void LLUpdateDownloader::Implementation::initializeCurlGet(std::string const & url)
+{
+ if(mCurl == 0) {
+ mCurl = curl_easy_init();
+ } else {
+ curl_easy_reset(mCurl);
+ }
+
+ llassert(mCurl != 0); // TODO: real error handling here.
+
+ CURLcode code;
+ code = curl_easy_setopt(mCurl, CURLOPT_NOSIGNAL, true);
+ code = curl_easy_setopt(mCurl, CURLOPT_FOLLOWLOCATION, true);
+ code = curl_easy_setopt(mCurl, CURLOPT_WRITEFUNCTION, &write_function);
+ code = curl_easy_setopt(mCurl, CURLOPT_WRITEDATA, this);
+ code = curl_easy_setopt(mCurl, CURLOPT_HEADERFUNCTION, &header_function);
+ code = curl_easy_setopt(mCurl, CURLOPT_HEADERDATA, this);
+ code = curl_easy_setopt(mCurl, CURLOPT_HTTPGET, true);
+ code = curl_easy_setopt(mCurl, CURLOPT_URL, url.c_str());
+}
+
+
+void LLUpdateDownloader::Implementation::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);
+ LL_INFOS("UpdateDownload") << "downloading " << filePath << LL_ENDL;
+ LL_INFOS("UpdateDownload") << "from " << uri.asString() << LL_ENDL;
+ downloadData["path"] = filePath;
+ llofstream dataStream(mDownloadRecordPath);
+ LLSDSerialize parser;
+ parser.toPrettyXML(downloadData, dataStream);
+
+ mDownloadStream.open(filePath, std::ios_base::out | std::ios_base::binary);
+ initializeCurlGet(uri.asString());
+ start();
+}
diff --git a/indra/viewer_components/updater/llupdatedownloader.h b/indra/viewer_components/updater/llupdatedownloader.h
new file mode 100644
index 0000000000..6118c4338e
--- /dev/null
+++ b/indra/viewer_components/updater/llupdatedownloader.h
@@ -0,0 +1,79 @@
+/**
+ * @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 <stdexcept>
+#include <string>
+#include <boost/shared_ptr.hpp>
+#include "lluri.h"
+
+
+//
+// An asynchronous download service for fetching updates.
+//
+class LLUpdateDownloader
+{
+public:
+ class BusyError;
+ class Client;
+ class Implementation;
+
+ LLUpdateDownloader(Client & client);
+
+ // Cancel any in progress download; a no op if none is in progress.
+ void cancel(void);
+
+ // Start a new download.
+ //
+ // This method will throw a BusyException instance if a download is already
+ // in progress.
+ 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 {
+public:
+
+ // The download has completed successfully.
+ virtual void downloadComplete(void) = 0;
+
+ // The download failed.
+ virtual void downloadError(std::string const & message) = 0;
+};
+
+
+#endif \ No newline at end of file
diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp
index 1d0ead3cd4..e865552fb3 100644
--- a/indra/viewer_components/updater/llupdaterservice.cpp
+++ b/indra/viewer_components/updater/llupdaterservice.cpp
@@ -25,6 +25,7 @@
#include "linden_common.h"
+#include "llupdatedownloader.h"
#include "llevents.h"
#include "lltimer.h"
#include "llupdaterservice.h"
@@ -42,11 +43,14 @@ boost::weak_ptr<LLUpdaterServiceImpl> gUpdater;
class LLUpdaterServiceImpl :
public LLPluginProcessParentOwner,
- public LLUpdateChecker::Client
+ public LLUpdateChecker::Client,
+ public LLUpdateDownloader::Client
{
- static const std::string ListenerName;
+ static const std::string sListenerName;
+ std::string mProtocolVersion;
std::string mUrl;
+ std::string mPath;
std::string mChannel;
std::string mVersion;
@@ -55,6 +59,7 @@ class LLUpdaterServiceImpl :
boost::scoped_ptr<LLPluginProcessParent> mPlugin;
LLUpdateChecker mUpdateChecker;
+ LLUpdateDownloader mUpdateDownloader;
LLTimer mTimer;
void retry(void);
@@ -71,10 +76,12 @@ public:
virtual void pluginLaunchFailed();
virtual void pluginDied();
- void setParams(const std::string& url,
+ void setParams(const std::string& protocol_version,
+ const std::string& url,
+ const std::string& path,
const std::string& channel,
const std::string& version);
-
+
void setCheckPeriod(unsigned int seconds);
void startChecking();
@@ -83,20 +90,25 @@ public:
// LLUpdateChecker::Client:
virtual void error(std::string const & message);
- virtual void optionalUpdate(std::string const & newVersion);
- virtual void requiredUpdate(std::string const & newVersion);
+ virtual void optionalUpdate(std::string const & newVersion, LLURI const & uri);
+ virtual void requiredUpdate(std::string const & newVersion, LLURI const & uri);
virtual void upToDate(void);
+ // LLUpdateDownloader::Client
+ void downloadComplete(void) { retry(); }
+ void downloadError(std::string const & message) { retry(); }
+
bool onMainLoop(LLSD const & event);
};
-const std::string LLUpdaterServiceImpl::ListenerName = "LLUpdaterServiceImpl";
+const std::string LLUpdaterServiceImpl::sListenerName = "LLUpdaterServiceImpl";
LLUpdaterServiceImpl::LLUpdaterServiceImpl() :
mIsChecking(false),
mCheckPeriod(0),
mPlugin(0),
- mUpdateChecker(*this)
+ mUpdateChecker(*this),
+ mUpdateDownloader(*this)
{
// Create the plugin parent, this is the owner.
mPlugin.reset(new LLPluginProcessParent(this));
@@ -105,7 +117,7 @@ LLUpdaterServiceImpl::LLUpdaterServiceImpl() :
LLUpdaterServiceImpl::~LLUpdaterServiceImpl()
{
LL_INFOS("UpdaterService") << "shutting down updater service" << LL_ENDL;
- LLEventPumps::instance().obtain("mainloop").stopListening(ListenerName);
+ LLEventPumps::instance().obtain("mainloop").stopListening(sListenerName);
}
// LLPluginProcessParentOwner interfaces
@@ -126,7 +138,9 @@ void LLUpdaterServiceImpl::pluginDied()
{
};
-void LLUpdaterServiceImpl::setParams(const std::string& url,
+void LLUpdaterServiceImpl::setParams(const std::string& protocol_version,
+ const std::string& url,
+ const std::string& path,
const std::string& channel,
const std::string& version)
{
@@ -136,7 +150,9 @@ void LLUpdaterServiceImpl::setParams(const std::string& url,
" before setting params.");
}
+ mProtocolVersion = protocol_version;
mUrl = url;
+ mPath = path;
mChannel = channel;
mVersion = version;
}
@@ -157,7 +173,7 @@ void LLUpdaterServiceImpl::startChecking()
}
mIsChecking = true;
- mUpdateChecker.check(mUrl, mChannel, mVersion);
+ mUpdateChecker.check(mProtocolVersion, mUrl, mPath, mChannel, mVersion);
}
}
@@ -179,14 +195,14 @@ void LLUpdaterServiceImpl::error(std::string const & message)
retry();
}
-void LLUpdaterServiceImpl::optionalUpdate(std::string const & newVersion)
+void LLUpdaterServiceImpl::optionalUpdate(std::string const & newVersion, LLURI const & uri)
{
- retry();
+ mUpdateDownloader.download(uri);
}
-void LLUpdaterServiceImpl::requiredUpdate(std::string const & newVersion)
+void LLUpdaterServiceImpl::requiredUpdate(std::string const & newVersion, LLURI const & uri)
{
- retry();
+ mUpdateDownloader.download(uri);
}
void LLUpdaterServiceImpl::upToDate(void)
@@ -201,7 +217,7 @@ void LLUpdaterServiceImpl::retry(void)
mTimer.start();
mTimer.setTimerExpirySec(mCheckPeriod);
LLEventPumps::instance().obtain("mainloop").listen(
- ListenerName, boost::bind(&LLUpdaterServiceImpl::onMainLoop, this, _1));
+ sListenerName, boost::bind(&LLUpdaterServiceImpl::onMainLoop, this, _1));
}
bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event)
@@ -209,8 +225,8 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event)
if(mTimer.hasExpired())
{
mTimer.stop();
- LLEventPumps::instance().obtain("mainloop").stopListening(ListenerName);
- mUpdateChecker.check(mUrl, mChannel, mVersion);
+ LLEventPumps::instance().obtain("mainloop").stopListening(sListenerName);
+ mUpdateChecker.check(mProtocolVersion, mUrl, mPath, mChannel, mVersion);
} else {
// Keep on waiting...
}
@@ -239,11 +255,13 @@ LLUpdaterService::~LLUpdaterService()
{
}
-void LLUpdaterService::setParams(const std::string& url,
- const std::string& chan,
- const std::string& vers)
+void LLUpdaterService::setParams(const std::string& protocol_version,
+ const std::string& url,
+ const std::string& path,
+ const std::string& channel,
+ const std::string& version)
{
- mImpl->setParams(url, chan, vers);
+ mImpl->setParams(protocol_version, url, path, channel, version);
}
void LLUpdaterService::setCheckPeriod(unsigned int seconds)
diff --git a/indra/viewer_components/updater/llupdaterservice.h b/indra/viewer_components/updater/llupdaterservice.h
index 313ae8ada3..83b09c4bdd 100644
--- a/indra/viewer_components/updater/llupdaterservice.h
+++ b/indra/viewer_components/updater/llupdaterservice.h
@@ -42,9 +42,9 @@ public:
LLUpdaterService();
~LLUpdaterService();
- // The base URL.
- // *NOTE:Mani The grid, if any, would be embedded in the base URL.
- void setParams(const std::string& url,
+ void setParams(const std::string& version,
+ const std::string& url,
+ const std::string& path,
const std::string& channel,
const std::string& version);
diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
index d93a85cf7d..958526e35b 100644
--- a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
+++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
@@ -29,6 +29,7 @@
// associated header
#include "../llupdaterservice.h"
#include "../llupdatechecker.h"
+#include "../llupdatedownloader.h"
#include "../../../test/lltut.h"
//#define DEBUG_ON
@@ -59,7 +60,11 @@ LLPluginMessage::LLPluginMessage(LLPluginMessage const&) {}
LLUpdateChecker::LLUpdateChecker(LLUpdateChecker::Client & client)
{}
-void LLUpdateChecker::check(std::string const & host, std::string channel, std::string version){}
+void LLUpdateChecker::check(std::string const & protocolVersion, std::string const & hostUrl,
+ std::string const & servicePath, std::string channel, std::string version)
+{}
+LLUpdateDownloader::LLUpdateDownloader(Client & ) {}
+void LLUpdateDownloader::download(LLURI const & ){}
/*****************************************************************************
* TUT
@@ -109,9 +114,9 @@ namespace tut
bool got_usage_error = false;
try
{
- updater.setParams(test_url, test_channel, test_version);
+ updater.setParams("1.0",test_url, "update" ,test_channel, test_version);
updater.startChecking();
- updater.setParams("other_url", test_channel, test_version);
+ updater.setParams("1.0", "other_url", "update", test_channel, test_version);
}
catch(LLUpdaterService::UsageError)
{
@@ -125,7 +130,7 @@ namespace tut
{
DEBUG;
LLUpdaterService updater;
- updater.setParams(test_url, test_channel, test_version);
+ updater.setParams("1.0", test_url, "update", test_channel, test_version);
updater.startChecking();
ensure(updater.isChecking());
updater.stopChecking();