Browse Source

Fix some straggling issues in plSelfPatcher.

- Fixed the status thread waiting many seconds before requesting the status for the first time.
- Fixed msi execution by removing the workaround for mapped network drives. That seems like a corner-case not worth worrying about anyway.
- Fixed total bytes being updated too late, causing interesting download progress.

(cherry picked from commit a893d74a209b44c683552358dedb6c85f9924bf8)
hoikas/newpatcher-1
Adam Johnson 5 years ago committed by rarified
parent
commit
d1f28306fe
  1. 7
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plUruLauncher/Main.cpp
  2. 21
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plUruLauncher/SelfPatcher.cpp

7
MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plUruLauncher/Main.cpp

@ -712,10 +712,6 @@ static void StatusCallback(void *)
// update while we are running // update while we are running
do do
{ {
DWORD result = WaitForSingleObject(s_shutdownDesiredEvent.Handle(), UPDATE_STATUSMSG_SECONDS * 1000);
if (result == WAIT_OBJECT_0)
break;
if(BuildTypeServerStatusPath()) if(BuildTypeServerStatusPath())
{ {
hSession = WinHttpOpen( hSession = WinHttpOpen(
@ -746,6 +742,9 @@ static void StatusCallback(void *)
WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hConnect);
WinHttpCloseHandle(hSession); WinHttpCloseHandle(hSession);
} }
if (s_shutdownDesiredEvent.Wait(UPDATE_STATUSMSG_SECONDS * 1000))
break;
} while (!s_shutdown); } while (!s_shutdown);
s_statusEvent.Signal(); s_statusEvent.Signal();

21
MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plUruLauncher/SelfPatcher.cpp

@ -300,7 +300,7 @@ UInt32 SelfPatcherStream::Write(UInt32 byteCount, const void* buffer) {
SetBytesRemaining(0); SetBytesRemaining(0);
SetTimeRemaining(0); SetTimeRemaining(0);
} else { } else {
SetBytesRemaining(totalBytes - byteCount); SetBytesRemaining(totalBytes - progress);
DWORD bytesPerSec = (progress) / max(TimeGetSecondsSince2001Utc() - startTime, 1); DWORD bytesPerSec = (progress) / max(TimeGetSecondsSince2001Utc() - startTime, 1);
SetTimeRemaining((totalBytes - progress) / max(bytesPerSec, 1)); SetTimeRemaining((totalBytes - progress) / max(bytesPerSec, 1));
} }
@ -434,6 +434,7 @@ void plSelfPatcher::ICheckAndRequest(PatcherWork*& wk)
wk->fFlags |= kRequestNewPatcher; wk->fFlags |= kRequestNewPatcher;
LogMsg(kLogDebug, L"plSelfPatcher::ICheckAndRequest: File '%s' needs to be downloaded.", wk->fEntry.clientName); LogMsg(kLogDebug, L"plSelfPatcher::ICheckAndRequest: File '%s' needs to be downloaded.", wk->fEntry.clientName);
SelfPatcherStream::totalBytes += (wk->fEntry.zipSize != 0) ? wk->fEntry.zipSize : wk->fEntry.fileSize;
wk->fType = kDownload; wk->fType = kDownload;
IEnqueueWork(wk, isPatcher); IEnqueueWork(wk, isPatcher);
} }
@ -457,7 +458,6 @@ void plSelfPatcher::IDownloadFile(PatcherWork*& wk)
SetText("Downloading update..."); SetText("Downloading update...");
} }
SelfPatcherStream::totalBytes += (wk->fEntry.zipSize != 0) ? wk->fEntry.zipSize : wk->fEntry.fileSize;
SelfPatcherStream* s = NEWZERO(SelfPatcherStream); SelfPatcherStream* s = NEWZERO(SelfPatcherStream);
if (!s->Open(wk->fEntry.clientName, L"wb")) { if (!s->Open(wk->fEntry.clientName, L"wb")) {
LogMsg(kLogError, L"plSelfPatcher::IDownloadFile: Failed to create file: %s, errno: %u", wk->fEntry.clientName, errno); LogMsg(kLogError, L"plSelfPatcher::IDownloadFile: Failed to create file: %s, errno: %u", wk->fEntry.clientName, errno);
@ -517,10 +517,6 @@ HANDLE plSelfPatcher::ICreateProcess(const wchar* path, const wchar* args, bool
// launched by Windows (such as errors) to deadlock the UI quite horribly. Further, // launched by Windows (such as errors) to deadlock the UI quite horribly. Further,
// ShellExecuteExW pops up that weird "do you want to run this file you downloaded from the internet?" // ShellExecuteExW pops up that weird "do you want to run this file you downloaded from the internet?"
// box, which we can't actually interact with due to the above. // box, which we can't actually interact with due to the above.
wchar exePath[MAX_PATH];
PathGetCurrentDirectory(exePath, arrsize(exePath));
PathAddFilename(exePath, exePath, path, arrsize(exePath));
if (!forceShell) { if (!forceShell) {
STARTUPINFOW si; STARTUPINFOW si;
PROCESS_INFORMATION pi; PROCESS_INFORMATION pi;
@ -529,9 +525,8 @@ HANDLE plSelfPatcher::ICreateProcess(const wchar* path, const wchar* args, bool
si.cb = sizeof(si); si.cb = sizeof(si);
wchar cmdline[MAX_PATH]; wchar cmdline[MAX_PATH];
const wchar* exeFilename = PathFindFilename(path); StrPrintf(cmdline, arrsize(cmdline), L"%s %s", path, args);
StrPrintf(cmdline, arrsize(cmdline), L"%s %s", exeFilename, args); BOOL result = CreateProcessW(path,
BOOL result = CreateProcessW(exePath,
cmdline, cmdline,
NULL, NULL,
NULL, NULL,
@ -543,12 +538,11 @@ HANDLE plSelfPatcher::ICreateProcess(const wchar* path, const wchar* args, bool
&pi); &pi);
CloseHandle(pi.hThread); CloseHandle(pi.hThread);
if (result != FALSE) { if (result != FALSE) {
free(exePath);
return pi.hProcess; return pi.hProcess;
} else { } else {
wchar* error = FormatSystemError(); wchar* error = FormatSystemError();
LogMsg(kLogError, L"plSelfPatcher::ICreateProcess: CreateProcessW failed for '%s': %u %s", LogMsg(kLogError, L"plSelfPatcher::ICreateProcess: CreateProcessW failed for '%s': %u %s",
exePath, GetLastError(), error); path, GetLastError(), error);
LocalFree(error); LocalFree(error);
// Purposefully falling through to ShellExecuteExW // Purposefully falling through to ShellExecuteExW
} }
@ -560,16 +554,15 @@ HANDLE plSelfPatcher::ICreateProcess(const wchar* path, const wchar* args, bool
info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NOASYNC | SEE_MASK_FLAG_NO_UI; info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NOASYNC | SEE_MASK_FLAG_NO_UI;
info.hwnd = fLauncherInfo->dialog; info.hwnd = fLauncherInfo->dialog;
// Not explicitly setting lpVerb to L"runas" because this seemingly breaks msiexec. // Not explicitly setting lpVerb to L"runas" because this seemingly breaks msiexec.
info.lpFile = exePath; info.lpFile = path;
info.lpParameters = args; info.lpParameters = args;
if (ShellExecuteExW(&info) == FALSE) { if (ShellExecuteExW(&info) == FALSE) {
wchar* error = FormatSystemError(); wchar* error = FormatSystemError();
LogMsg(kLogError, L"plSelfPatcher::ICreateProcess: ShellExecuteExW failed for '%s': %u %s", LogMsg(kLogError, L"plSelfPatcher::ICreateProcess: ShellExecuteExW failed for '%s': %u %s",
exePath, GetLastError(), error); path, GetLastError(), error);
LocalFree(error); LocalFree(error);
} }
free(exePath);
return info.hProcess; return info.hProcess;
} }

Loading…
Cancel
Save