void ShowShortcutTree ( HWND hDlg ) { Str_c sPath; if ( ShowFileTreeDlg ( hDlg, sPath, true ) ) { RemoveSlash ( sPath ); SetEditTextFocused ( GetDlgItem ( hDlg, IDC_TARGET ), Str_c ( L"\"" ) + sPath + L"\"" ); } }
std::string GetDirAtLevel(std::string strIn, int Level) { if (Level == 0) return strIn; for (int i=0; i<Level;i++) { strIn = strIn.substr(0, RemoveSlash(strIn).find_last_of(DirSepChar[0]) +1); } return strIn; }
Str_c RemoveSlashes ( const Str_c & sStr ) { Str_c sResult = sStr; RemoveSlash ( sResult ); while ( sResult.Length () > 0 && sResult [0] == L'\\' ) sResult.Erase ( 0, 1 ); return sResult; }
int DownloadFiles(char *szInputIniFile, char *szDownloadDir, char *szProxyServer, char *szProxyPort, char *szProxyUser, char *szProxyPasswd, BOOL bShowRetryMsg, BOOL bIgnoreAllNetworkErrors, char *szFailedFile, DWORD dwFailedFileSize) { char szBuf[MAX_BUF]; char szCurrentFile[MAX_BUF]; char szSection[MAX_INI_SK]; char szKey[MAX_INI_SK]; char szSavedCwd[MAX_BUF_MEDIUM]; int iCounter; int rv; int iFileDownloadRetries; int iIgnoreFileNetworkError; int iLocalTimeOutCounter; DWORD dwTotalEstDownloadSize; char szPartiallyDownloadedFilename[MAX_BUF]; BOOL bDownloadInitiated; char szTempURL[MAX_BUF]; char szWorkingURLPathOnly[MAX_BUF]; siC *siCCurrentFileObj = NULL; ZeroMemory(szTempURL, sizeof(szTempURL)); ZeroMemory(szWorkingURLPathOnly, sizeof(szWorkingURLPathOnly)); if(szInputIniFile == NULL) return(WIZ_ERROR_UNDEFINED); if(szFailedFile) ZeroMemory(szFailedFile, dwFailedFileSize); InitTickInfo(); GetCurrentDirectory(sizeof(szSavedCwd), szSavedCwd); SetCurrentDirectory(szDownloadDir); rv = WIZ_OK; dwTotalEstDownloadSize = 0; giTotalArchivesToDownload = 0; glLastBytesSoFar = 0; glAbsoluteBytesSoFar = 0; glBytesResumedFrom = 0; gdwTickStart = 0; /* Initialize the counter used to * calculate download rate */ gbStartTickCounter = FALSE; /* used to determine when to start * the tick counter used to calculate * the download rate */ gbUrlChanged = TRUE; gbDlgDownloadMinimized = FALSE; gbDlgDownloadJustMinimized = FALSE; gdwDownloadDialogStatus = CS_NONE; gbShowDownloadRetryMsg = bShowRetryMsg; gszConfigIniFile = szInputIniFile; bDownloadInitiated = FALSE; GetTotalArchivesToDownload(&giTotalArchivesToDownload, &dwTotalEstDownloadSize); glTotalKb = dwTotalEstDownloadSize; GetSetupCurrentDownloadFile(szPartiallyDownloadedFilename, sizeof(szPartiallyDownloadedFilename)); InitDownloadDlg(); for(giIndex = 0; giIndex < giTotalArchivesToDownload; giIndex++) { /* set (or reset) the counter to 0 in order to read the * next files's 0'th url from the .idi file */ iCounter = 0; gbUrlChanged = TRUE; /* Update the download dialog with new URL */ wsprintf(szSection, "File%d", giIndex); wsprintf(szKey, "url%d", iCounter); GetPrivateProfileString(szSection, szKey, "", szTempURL, sizeof(szTempURL), gszConfigIniFile); if(*szTempURL == '\0') continue; if(!bDownloadInitiated) { ParsePath(szTempURL, szWorkingURLPathOnly, sizeof(szWorkingURLPathOnly), TRUE, //use '/' as the path delimiter PP_PATH_ONLY); } GetPrivateProfileString(szSection, "desc", "", gszCurrentDownloadFileDescription, sizeof(gszCurrentDownloadFileDescription), gszConfigIniFile); iIgnoreFileNetworkError = GetPrivateProfileInt(szSection, "Ignore File Network Error", 0, gszConfigIniFile); /* save the file name to be downloaded */ ParsePath(szTempURL, szCurrentFile, sizeof(szCurrentFile), TRUE, //use '/' as the path delimiter PP_FILENAME_ONLY); RemoveSlash(szWorkingURLPathOnly); wsprintf(gszUrl, "%s/%s", szWorkingURLPathOnly, szCurrentFile); /* retrieve the file's data structure */ siCCurrentFileObj = GetObjectFromArchiveName(szCurrentFile); if((*szPartiallyDownloadedFilename != 0) && (lstrcmpi(szPartiallyDownloadedFilename, szCurrentFile) == 0)) { struct stat statBuf; if(stat(szPartiallyDownloadedFilename, &statBuf) != -1) { glAbsoluteBytesSoFar += statBuf.st_size; glBytesResumedFrom = statBuf.st_size; } } lstrcpy(gszTo, szDownloadDir); AppendBackSlash(gszTo, sizeof(gszTo)); lstrcat(gszTo, szCurrentFile); if(gbDlgDownloadMinimized) SetMinimizedDownloadTitle((int)GetPercentSoFar()); else { SetStatusUrl(); SetRestoredDownloadTitle(); } SetSetupCurrentDownloadFile(szCurrentFile); iFileDownloadRetries = 0; iLocalTimeOutCounter = 0; do { ProcessWindowsMessages(); /* Download starts here */ if((szProxyServer != NULL) && (szProxyPort != NULL) && (*szProxyServer != '\0') && (*szProxyPort != '\0')) /* If proxy info is provided, use HTTP proxy */ rv = DownloadViaProxy(gszUrl, szProxyServer, szProxyPort, szProxyUser, szProxyPasswd); else { /* is this an HTTP URL? */ if(strncmp(gszUrl, kHTTP, lstrlen(kHTTP)) == 0) rv = DownloadViaHTTP(gszUrl); /* or is this an FTP URL? */ else if(strncmp(gszUrl, kFTP, lstrlen(kFTP)) == 0) rv = DownloadViaFTP(gszUrl); } bDownloadInitiated = TRUE; if((rv == nsFTPConn::E_USER_CANCEL) || (gdwDownloadDialogStatus == CS_PAUSE)) { if(gdwDownloadDialogStatus == CS_PAUSE) { CloseSocket(szProxyServer, szProxyPort); /* rv needs to be set to something * other than E_USER_CANCEL or E_OK */ rv = nsFTPConn::E_CMD_UNEXPECTED; PauseTheDownload(rv, &iFileDownloadRetries); bDownloadInitiated = FALSE; /* restart the download using * new socket connection */ } else { /* user canceled; break out of the do loop */ break; } } else if((rv != nsFTPConn::OK) && (rv != nsFTPConn::E_CMD_FAIL) && (rv != nsSocket::E_BIND) && (rv != nsHTTPConn::E_HTTP_RESPONSE) && (gdwDownloadDialogStatus != CS_CANCEL)) { /* We timed out. No response from the server, or * we somehow lost connection. */ char szTitle[MAX_BUF_SMALL]; char szMsgDownloadPaused[MAX_BUF]; /* Incrememt the time out counter on E_TIMEOUT */ if(rv == nsSocket::E_TIMEOUT) { ++siCCurrentFileObj->iNetTimeOuts; ++iLocalTimeOutCounter; } CloseSocket(szProxyServer, szProxyPort); /* If the number of timeouts is %3 == 0, then let's pause * the download process. Otherwise, just close the * connection and open a new one to see if the download * can be restarted automatically. */ if((rv != nsSocket::E_TIMEOUT) || (rv == nsSocket::E_TIMEOUT) && ((iLocalTimeOutCounter % kModTimeOutValue) == 0)) { /* Start the pause tick counter here because we don't know how * long before the user will dismiss the MessageBox() */ if(!gtiPaused.bTickStarted) { gtiPaused.dwTickBegin = GetTickCount(); gtiPaused.bTickStarted = TRUE; gtiPaused.bTickDownloadResumed = FALSE; } /* The connection unexepectedly dropped for some reason, so inform * the user that the download will be Paused, and then update the * Download dialog to show the Paused state. */ GetConfigIniProfileString("Messages", "MB_WARNING_STR", "", szTitle, sizeof(szTitle)); GetConfigIniProfileString("Strings", "Message Download Paused", "", szMsgDownloadPaused, sizeof(szMsgDownloadPaused)); MessageBox(dlgInfo.hWndDlg, szMsgDownloadPaused, szTitle, MB_ICONEXCLAMATION); /* Let's make sure we're in a paused state */ gdwDownloadDialogStatus = CS_PAUSE; PauseTheDownload(rv, &iFileDownloadRetries); } else /* Let's make sure we're _not_ in a paused state */ gdwDownloadDialogStatus = CS_NONE; } /* We don't count time outs as normal failures. We're * keeping track of time outs differently. */ if(rv != nsSocket::E_TIMEOUT) ++iFileDownloadRetries; if((iFileDownloadRetries > MAX_FILE_DOWNLOAD_RETRIES) && (rv != nsFTPConn::E_USER_CANCEL) && (gdwDownloadDialogStatus != CS_CANCEL)) { /* since the download retries maxed out, increment the counter * to read the next url for the current file */ ++iCounter; wsprintf(szKey, "url%d", iCounter); GetPrivateProfileString(szSection, szKey, "", szTempURL, sizeof(szTempURL), gszConfigIniFile); if(*szTempURL != '\0') { /* Found more urls to download from for the current file. * Update the dialog to show the new url and reset the * file download retries to 0 since it's a new url. */ gbUrlChanged = TRUE; iFileDownloadRetries = 0; bDownloadInitiated = FALSE; // restart the download using new socket connection CloseSocket(szProxyServer, szProxyPort); ParsePath(szTempURL, szWorkingURLPathOnly, sizeof(szWorkingURLPathOnly), TRUE, //use '/' as the path delimiter PP_PATH_ONLY); RemoveSlash(szWorkingURLPathOnly); wsprintf(gszUrl, "%s/%s", szWorkingURLPathOnly, szCurrentFile); SetStatusUrl(); } } } while((rv != nsFTPConn::E_USER_CANCEL) && (rv != nsFTPConn::OK) && (gdwDownloadDialogStatus != CS_CANCEL) && (iFileDownloadRetries <= MAX_FILE_DOWNLOAD_RETRIES)); /* Save the number of retries for each file */ siCCurrentFileObj->iNetRetries = iFileDownloadRetries < 1 ? 0:iFileDownloadRetries - 1; if((rv == nsFTPConn::E_USER_CANCEL) || (gdwDownloadDialogStatus == CS_CANCEL)) { /* make sure rv is E_USER_CANCEL when gdwDownloadDialogStatus * is CS_CANCEL */ rv = nsFTPConn::E_USER_CANCEL; if(szFailedFile && ((DWORD)lstrlen(szCurrentFile) <= dwFailedFileSize)) lstrcpy(szFailedFile, gszCurrentDownloadFileDescription); /* break out of for() loop */ break; } if((rv != nsFTPConn::OK) && (iFileDownloadRetries > MAX_FILE_DOWNLOAD_RETRIES) && !bIgnoreAllNetworkErrors && !iIgnoreFileNetworkError) { /* too many retries from failed downloads */ char szMsg[MAX_BUF]; if(szFailedFile && ((DWORD)lstrlen(szCurrentFile) <= dwFailedFileSize)) lstrcpy(szFailedFile, gszCurrentDownloadFileDescription); GetConfigIniProfileString("Strings", "Error Too Many Network Errors", "", szMsg, sizeof(szMsg)); if(*szMsg != '\0') { wsprintf(szBuf, szMsg, szCurrentFile); PrintError(szBuf, ERROR_CODE_HIDE); } iFileDownloadRetries = 0; // reset the file download retries counter since // we'll be restarting the download again. bDownloadInitiated = FALSE; // restart the download using new socket connection CloseSocket(szProxyServer, szProxyPort); --giIndex; // Decrement the file index counter because we'll be trying to // download the same file again. We don't want to go to the next // file just yet. /* Let's make sure we're in a paused state. */ /* The pause state will be unset by DownloadDlgProc(). */ gdwDownloadDialogStatus = CS_PAUSE; PauseTheDownload(rv, &iFileDownloadRetries); } else if(bIgnoreAllNetworkErrors || iIgnoreFileNetworkError) rv = nsFTPConn::OK; UnsetSetupCurrentDownloadFile(); } CloseSocket(szProxyServer, szProxyPort); DeInitDownloadDlg(); SetCurrentDirectory(szSavedCwd); return(rv); }