From 420b91db29485df39fd6e724e782c449158811cb Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 2 Jan 2007 08:33:20 +0000 Subject: Print done when done. --- indra/win_updater/updater.cpp | 527 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 527 insertions(+) create mode 100644 indra/win_updater/updater.cpp (limited to 'indra/win_updater') diff --git a/indra/win_updater/updater.cpp b/indra/win_updater/updater.cpp new file mode 100644 index 0000000000..99680984d1 --- /dev/null +++ b/indra/win_updater/updater.cpp @@ -0,0 +1,527 @@ +/** + * @file updater.cpp + * @brief Windows auto-updater + * + * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +// +// Usage: updater -userserver [-name ] [-program ] [-silent] +// + +#include +#include + +#include +#include "llfile.h" + +#define BUFSIZE 8192 + +int gTotalBytesRead = 0; +HWND gWindow = NULL; +WCHAR gProgress[256]; +char* gUserServer; +char* gProgramName; +char* gProductName; +bool gIsSilent; + +#if _DEBUG +FILE* logfile = 0; +#endif + +char* wchars_to_utf8chars(WCHAR* in_chars) +{ + int tlen = 0; + WCHAR* twc = in_chars; + while (*twc++ != 0) + { + tlen++; + } + char* outchars = new char[tlen]; + char* res = outchars; + for (int i=0; i [-name ] [-program ] [-silent]", + L"Usage", MB_OK); + return parse_args_result; + } + + // Did we get a userserver to work with? + if (!gUserServer) + { + MessageBox(gWindow, L"Please specify the IP address of the userserver on the command line", + L"Error", MB_OK); + return 1; + } + + // Can't feed GetTempPath into GetTempFile directly + if (0 == GetTempPathA(MAX_PATH - 14, update_exec_path)) + { + MessageBox(gWindow, L"Problem with GetTempPath()", + L"Error", MB_OK); + return 1; + } + if (0 == GetTempFileNameA(update_exec_path, NULL, 0, update_exec_path)) + { + MessageBox(gWindow, L"Problem with GetTempFileName()", + L"Error", MB_OK); + return 1; + } + // Hack hack hack + ptr = strrchr(update_exec_path, '.'); + *(ptr + 1) = 'e'; + *(ptr + 2) = 'x'; + *(ptr + 3) = 'e'; + *(ptr + 4) = 0; + wcscpy(update_uri, UPDATE_URIBASE); + WCHAR wcmdline[2048]; + mbstowcs(wcmdline, gUserServer, 2048); + wcscat(update_uri, wcmdline); + + int success; + int cancelled; + + // Actually do the download +#if _DEBUG + fprintf(logfile,"Calling get_url_into_file\n"); + fflush(logfile); +#endif + success = get_url_into_file(update_uri, update_exec_path, &cancelled); + + // WinInet can't tell us if we got a 404 or not. Therefor, we check + // for the size of the downloaded file, and assume that our installer + // will always be greater than 1MB. + if (gTotalBytesRead < (1024 * 1024) && ! cancelled) + { + MessageBox(gWindow, + L"The Second Life auto-update has failed.\n" + L"The problem may be caused by other software installed \n" + L"on your computer, such as a firewall.\n" + L"Please visit http://secondlife.com/download/ \n" + L"to download the latest version of Second Life.\n", + NULL, MB_OK); + return 1; + } + + if (cancelled) + { + // silently exit + return 0; + } + + if (!success) + { + MessageBox(gWindow, + L"Second Life download failed.\n" + L"Please try again later.", + NULL, MB_OK); + return 1; + } + + // Construct some parameters. + char params[2048]; + if (gIsSilent && gProgramName) + { + sprintf(params, "/S /P=\"%s\"", gProgramName); + } + else if (gProgramName) + { + sprintf(params, "/P=\"%s\"", gProgramName); + } + else if (gIsSilent) + { + sprintf(params, "/S"); + } + else + { + params[0] = '\0'; + } + + if (32 >= (int) ShellExecuteA(gWindow, "open", update_exec_path, params, + "C:\\", SW_SHOWDEFAULT)) + { + // No shit: less than or equal to 32 means failure + MessageBox(gWindow, L"ShellExecute failed. Please try again later.", NULL, MB_OK); + return 1; + } + + if (gIsSilent && gProductName) + { + WCHAR message[2048]; + WCHAR wproduct[2048]; + mbstowcs(wproduct, gProductName, 2048); + + wsprintf(message, + L"Updating %s. %s will automatically start once the update is complete. This may take a minute...", + wproduct, wproduct); + + MessageBox(gWindow, message, L"Download Complete", MB_OK); + } + + return 0; +} -- cgit v1.2.3