mirror of
https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git
synced 2025-07-20 04:09:16 +00:00
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)
This commit is contained in:
@ -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();
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user