Index: base/applications/rapps/loaddlg.c =================================================================== --- base/applications/rapps/loaddlg.c (revision 43946) +++ base/applications/rapps/loaddlg.c (working copy) @@ -47,6 +47,25 @@ BOOL *pbCancelled; } IBindStatusCallbackImpl; +#if DBG +#define TRACEW(_va_) DbgPrintW _va_ +#else +#define TRACEW(_va_) +#endif + +ULONG __cdecl DbgPrintW( IN LPWSTR Format, IN ... ) +{ + WCHAR Buf[ MAX_PATH*2 ]; + ULONG Len; + va_list va; + + va_start( va, Format ); + Len = wvsprintfW( Buf, Format, va ); + va_end( va ); + OutputDebugStringW( Buf ); + return Len; +} + static HRESULT WINAPI dlQueryInterface(IBindStatusCallback* This, REFIID riid, void** ppvObject) @@ -222,17 +241,20 @@ BOOL bCancelled = FALSE; BOOL bTempfile = FALSE; BOOL bCab = FALSE; + UINT Len, waitTime, maxWaitTime; + DWORD wr; /* built the path for the download */ p = wcsrchr(AppInfo->szUrlDownload, L'/'); if (!p) goto end; - if (wcslen(AppInfo->szUrlDownload) > 4) + Len = wcslen(AppInfo->szUrlDownload); + if (Len > 4) { - if (AppInfo->szUrlDownload[wcslen(AppInfo->szUrlDownload) - 4] == '.' && - AppInfo->szUrlDownload[wcslen(AppInfo->szUrlDownload) - 3] == 'c' && - AppInfo->szUrlDownload[wcslen(AppInfo->szUrlDownload) - 2] == 'a' && - AppInfo->szUrlDownload[wcslen(AppInfo->szUrlDownload) - 1] == 'b') + if (AppInfo->szUrlDownload[Len - 4] == '.' && + AppInfo->szUrlDownload[Len - 3] == 'c' && + AppInfo->szUrlDownload[Len - 2] == 'a' && + AppInfo->szUrlDownload[Len - 1] == 'b') { bCab = TRUE; if (!GetCurrentDirectoryW(MAX_PATH, path)) @@ -257,6 +279,8 @@ /* download it */ bTempfile = TRUE; dl = CreateDl(Context, &bCancelled); + if (!dl) DbgPrintW( L"err(%s:%d) CreateDl returned NULL!\n", __FILE__, __LINE__ ); + r = URLDownloadToFileW(NULL, AppInfo->szUrlDownload, path, 0, dl); if (dl) IBindStatusCallback_Release(dl); if (S_OK != r) goto end; @@ -270,19 +294,23 @@ r = CreateProcessW(path, NULL, NULL, NULL, 0, 0, NULL, NULL, &si, &pi); if (0 == r) goto end; - CloseHandle(pi.hThread); - WaitForSingleObject(pi.hProcess, INFINITE); - CloseHandle(pi.hProcess); + CloseHandle( pi.hThread ); + maxWaitTime = 10*60; // 10 min == 600 sec + for( waitTime = 0; waitTime < maxWaitTime; waitTime += 5 ) { + wr = WaitForSingleObject( pi.hProcess, 5000 ); + if (wr == WAIT_OBJECT_0) break; + } + if (waitTime >= maxWaitTime) TerminateProcess( pi.hProcess, EXIT_FAILURE ); + CloseHandle( pi.hProcess ); end: if (bTempfile) { if (bCancelled || (SettingsInfo.bDelInstaller && !bCab)) - DeleteFileW(path); + DeleteFileW( path ); } - EndDialog(Dlg, 0); - + EndDialog( Dlg, 0 ); return 0; }