//----------------------------------------------------------------------------------
// StartDownloads: Start the threads that will download the files.
//----------------------------------------------------------------------------------
void DownloadCtrl::StartDownloads(void)
{
	CustomInfo* pCustInfo = GetCustomInfo();

	CPatchData* pPatch = pCustInfo->GetSelectedPatch();
	if (pPatch)
	{
		#ifdef _DEBUG
			if (GetKeyState(VK_MENU) & GetKeyState(VK_CONTROL) & GetKeyState(VK_SHIFT) & 0x8000)
				pPatch->DebugBox(GetWindow());
		#endif

		GUIString sPatchFile = pPatch->GetPatchUrl();
		int nPos = sPatchFile.rFind('/');
		if (nPos == -1)
			nPos = sPatchFile.rFind('\\');
		if (nPos != -1)
			sPatchFile.erase(0, nPos + 1);
		else
			sPatchFile = TEXT("Update.exe");

		std::string aHostGraphic = pPatch->GetHostBmp();
		int aPos = aHostGraphic.find_last_of('.');
		std::string aHostGraphicExtension;
		if(aPos != std::string::npos && aHostGraphic.length() > aPos + 1)
			aHostGraphicExtension = aHostGraphic.substr(aPos+1);
		else
			aHostGraphicExtension = "bmp";

		m_sHostBitmapFile = GenerateTempFileName("FS", aHostGraphicExtension);

		CreateDirectoryRecursive(pCustInfo->GetPatchFolder());
		GUIString sPatchExe = pCustInfo->GetPatchFolder();
		sPatchExe.append(sPatchFile);

		pCustInfo->SetPatchFile(sPatchExe);

		mStartTime = time(NULL);
		mNumberCallbacks = 0;
		if (IsFtpAddress(pPatch->GetHostBmp()))
		{
			// Don't attempt to handle resumed downloads of bitmaps - not worth it.
			DeleteFile(std::string(m_sHostBitmapFile).c_str());
			m_pFtpGetBitmap = new FTPGetOp(pPatch->GetHostBmp(), true);
			m_pFtpGetBitmap->SetLocalPath(m_sHostBitmapFile);
			m_pFtpGetBitmap->SetCompletion(new DownloadCompletion(FtpBitmapDoneCallback));
			m_pFtpGetBitmap->RunAsync(static_cast<ULONG>(OP_TIMEOUT_INFINITE));
		}
		else
		{
			m_pHttpGetBitmap = new HTTPGetOp(pPatch->GetHostBmp());
			m_pHttpGetBitmap->SetLocalPath(m_sHostBitmapFile);
			m_pHttpGetBitmap->SetCompletion(new DownloadCompletion(HttpBitmapDoneCallback));
			m_pHttpGetBitmap->RunAsync(static_cast<ULONG>(OP_TIMEOUT_INFINITE));
		}

//		m_tDownloadStarted = GetTickCount();

		m_nPrevDownloadedFtpBytes = 0;
		if (IsFtpAddress(pPatch->GetPatchUrl()))
		{
			// If the previous patch profile does not match this patch profile, nuke the file.
			if (! pCustInfo->MatchFtpDownloadTag(sPatchExe, pCustInfo->GetNewVersion(), pPatch->GetPatchSize(), pPatch->GetChecksum()))
				DeleteFile(std::string(sPatchExe).c_str());
			else
				m_nPrevDownloadedFtpBytes = GetFileSize(sPatchExe);

			// Tag the patch's profile (so we can 'resume or not as appropriate later).
			pCustInfo->TagFtpDownload(sPatchExe, pCustInfo->GetNewVersion(), pPatch->GetPatchSize(), pPatch->GetChecksum());

			m_pFtpGetPatch = new FTPGetOp(pPatch->GetPatchUrl(), true);
			m_pFtpGetPatch->SetDoResume(true); // Allow resuming of downloads.
			m_pFtpGetPatch->SetLocalPath(sPatchExe);
			m_pFtpGetPatch->SetRecvChunkCompletion(new DownloadCompletion(PatchProgressCallback), CHUNCK_SIZE);
			m_pFtpGetPatch->SetCompletion(new DownloadCompletion(FtpPatchDoneCallback));
			m_pFtpGetPatch->RunAsync(static_cast<ULONG>(OP_TIMEOUT_INFINITE));
		}
		else
		{
			m_pHttpGetPatch = new HTTPGetOp(pPatch->GetPatchUrl());
			m_pHttpGetPatch->SetLocalPath(sPatchExe);
			m_pHttpGetPatch->SetRecvChunkCompletion(new DownloadCompletion(PatchProgressCallback), CHUNCK_SIZE);
			m_pHttpGetPatch->SetCompletion(new DownloadCompletion(HttpPatchDoneCallback));
			m_pHttpGetPatch->RunAsync(static_cast<ULONG>(OP_TIMEOUT_INFINITE));
		}

		m_bDownloadStarted = true;
	}
}
void UpdateResource_UnloadResources()
{
	Global_Yes_String.erase();
	Global_No_String.erase();
	Global_Ok_String.erase();
	Global_Cancel_String.erase();
	Global_Close_String.erase();
	Global_BadHelpExe_String.erase();
	Global_WrongSize_String.erase();
	Global_InvalidChecksum_String.erase();
	Global_InvalidPatch_String.erase();
	Global_Validation_String.erase();
	Global_Validating_String.erase();
	Global_DownloadFailures_String.erase();
	Global_DownloadAborts_String.erase();
	Global_NoStringRes_String.erase();
	Global_MenuAbout_String.erase();
	Global_ParamErrTitle_String.erase();
	Global_CfgFileTooBig_String.erase();
	Global_NoReadCfgFile_String.erase();
	Global_NoOpenCfgFile_String.erase();
	Global_PatcherDispName_String.erase();
	Global_BadHelpFile_String.erase();
	Global_BadResFile_String.erase();
	Global_UnknownParam_String.erase();
	Global_PrUnknown_String.erase();
	Global_PrUpToDate_String.erase();
	Global_PrPatchFound_String.erase();
	Global_PrPatchFetched_String.erase();
	Global_PrUserAbort_String.erase();
	Global_PrNoServerConnection_String.erase();
	Global_PrNoHostList_String.erase();
	Global_PrNoDownload_String.erase();
	Global_NoMonitor_String.erase();
	Global_PsUndetermined_String.erase();
	Global_NoFindPatch_String.erase();
	Global_NoRunPatch_String.erase();
	Global_PatchFailed_String.erase();
	Global_PrepPatcher_String.erase();
	Global_CheckingForThePatch_String.erase();
	Global_VerCheckFailed_String.erase();
	Global_PatchFound_String.erase();
	Global_NoRetrievePatch_String.erase();
	Global_Applying_String.erase();
	Global_AnotherPatch_String.erase();
	Global_PatchApplied_String.erase();
	Global_LaunchingExe_String.erase();
	Global_CheckingMotd_String.erase();
	Global_CheckingForMotd_String.erase();
	Global_UpToDate_String.erase();
	Global_PatcherInfoTitle_String.erase();
	Global_VersionFileCheckFailed_String.erase();
	Global_PatchReturnedError_String.erase();
	Global_CheckConnection_String.erase();
	Global_TimeOut_String.erase();
	Global_SkipMotd_String.erase();
	Global_Warning_String.erase();
	Global_IncompletePatch_String.erase();
	Global_SelfUpToDate_String.erase();
	Global_CheckingSelfForPatch_String.erase();
	Global_CloseForSelfPatch_String.erase();
	Global_SelfNoHostList_String.erase();
	Global_NoFindRestarter_String.erase();
	Global_NoRunRestarter_String.erase();
	Global_RestarterFailed_String.erase();
	Global_SierraUpdate_String.erase();
	Global_SelfUpdateLang_String.erase();
	Global_NoWritePsapi_String.erase();
	Global_NoWriteRestarter_String.erase();
	Global_Error_String.erase();
	Global_Host_String.erase();
	Global_Bytes_String.erase();
	Global_KiloBytes_String.erase();
	Global_MegaBytes_String.erase();
	Global_PrOptionalPatch_String.erase();
	Global_PrManualDownload_String.erase();
	Global_OptionalPatchFound_String.erase();
	Global_PossiblePatch_String.erase();
	Global_CheckForPossiblePatch_String.erase();
	Global_NoPatchUrl_String.erase();
	Global_LocalPatchDoesNotMatch_String.erase();
	Global_CheckConection_String.erase();
	Global_CheckConectionTitle_String.erase();
	Global_Success_String.erase();
	Global_MotdSkipped_String.erase();
	Global_MotdNotFound_String.erase();
	Global_GameMotdNotFound_String.erase();
	Global_MotdError_String.erase();
	Global_NoNewMotd_String.erase();
	Global_PatchRequired_String.erase();
	Global_OptionalPatch_String.erase();
	Global_PartialDirServerFailure_String.erase();
	Global_DirServerFailure_String.erase();
	Global_BadVersionNoUpdate_String.erase();
	Global_SierraUpBadVersionNoUpdate_String.erase();
	Global_PatchServerError_String.erase();
	Global_UpdateServerTimedOut_String.erase();
	Global_NoConfigFile_String.erase();
	Global_GameLogo_Image = NULL;
	Global_MpsLogo_Image = NULL;
	SelectHost_Title_String.erase();
	SelectHost_Info1_String.erase();
	SelectHost_Info2_String.erase();
	SelectHost_Info3_String.erase();
	SelectHost_Info4_String.erase();
	SelectHost_Info5_String.erase();
	SelectHost_Info6_String.erase();
	SelectHost_ConfigProxy_String.erase();
	SelectHost_Help_String.erase();
	SelectHost_Next_String.erase();
	SelectHost_HavePatch_String.erase();
	SelectHost_PatchFilter_String.erase();
	SelectHost_InfoManual_String.erase();
	SelectHost_Back_String.erase();
	SelectHost_FileOpenDlgTitle_String.erase();
	SelectHost_HostTitle_String.erase();
	SelectHost_Results_String.erase();
	SelectHost_WaitInfo1_String.erase();
	SelectHost_WaitInfo2_String.erase();
	SelectHost_WaitInfo3_String.erase();
	SelectHost_WaitInfo4_String.erase();
	SelectHost_WaitInfo5_String.erase();
	SelectHost_WaitInfo6_String.erase();
	ConfigProxy_Title_String.erase();
	ConfigProxy_Info1_String.erase();
	ConfigProxy_Info2_String.erase();
	ConfigProxy_Info3_String.erase();
	ConfigProxy_Info4_String.erase();
	ConfigProxy_Info5_String.erase();
	ConfigProxy_Info6_String.erase();
	ConfigProxy_UseProxy_String.erase();
	ConfigProxy_Host_String.erase();
	ConfigProxy_Port_String.erase();
	ConfigProxy_Help_String.erase();
	Download_Title_String.erase();
	Download_Info1_String.erase();
	Download_Info2_String.erase();
	Download_Info3_String.erase();
	Download_Info4_String.erase();
	Download_Info5_String.erase();
	Download_Info6_String.erase();
	Download_Host_String.erase();
	Download_Progress_String.erase();
	Download_Preparing_String.erase();
	Download_Estimating_String.erase();
	Download_Help_String.erase();
	Download_Back_String.erase();
	Download_VisitHost_String.erase();
	Download_HostedBy_String.erase();
	Download_BytesTransferred_String.erase();
	Download_ConnectionRefused_String.erase();
	Download_InvalidHttpHeader_String.erase();
	Download_InvalidHttpRedirect_String.erase();
	Download_TooManyHttpRedirects_String.erase();
	Download_DownloadError_String.erase();
	Download_UnknownHttpError_String.erase();
	Download_HttpError_String.erase();
	Download_Http404Error_String.erase();
	Download_Confirm_String.erase();
	Download_AbandonDownload_String.erase();
	Download_AbortPatch_String.erase();
	Download_UnknownFtpError_String.erase();
	Download_FtpError_String.erase();
	Download_InvalidFtpResp_String.erase();
	Download_InvalidFtpPasvResp_String.erase();
	Download_NoData_String.erase();
	Download_InvalidFtpFile_String.erase();
	Download_InvalidFtpUser_String.erase();
	Download_InvalidFtpPassword_String.erase();
	Download_TimeHoursMinutes_String.erase();
	Download_TimeHourMinutes_String.erase();
	Download_TimeMinutesSeconds_String.erase();
	Download_TimeMinuteSeconds_String.erase();
	Download_TimeSeconds_String.erase();
	Download_Http421Error_String.erase();
	Download_Next_String.erase();
	Download_UnableToFindHost_String.erase();
	Download_NoHostUrl_String.erase();
	Dialog_AbortDlgAbort_String.erase();
	Dialog_BaseBackground_Background = Background();
	Welcome_Continue_String.erase();
	Welcome_Cancel_String.erase();
	Welcome_ConfigProxy_String.erase();
	Welcome_Help_String.erase();
	Welcome_Info1_String.erase();
	Welcome_Info2_String.erase();
	Welcome_Info3_String.erase();
	Welcome_Info4_String.erase();
	Welcome_Info5_String.erase();
	Welcome_Info6_String.erase();
	Welcome_Title_String.erase();
	About_Version_String.erase();
	About_Copyright_String.erase();
	About_Title_String.erase();
	Motd_SystemTitle_String.erase();
	Motd_ProductTitle_String.erase();
	Motd_Info1_String.erase();
	Motd_Info2_String.erase();
	Motd_Info3_String.erase();
	Motd_Info4_String.erase();
	Motd_Info5_String.erase();
	Motd_Info6_String.erase();
	Motd_Help_String.erase();
	Motd_Back_String.erase();
	Motd_Next_String.erase();
	Motd_Skip_String.erase();
	Motd_Title_String.erase();
	VisitHost_Title_String.erase();
	VisitHost_Info1_String.erase();
	VisitHost_Info2_String.erase();
	VisitHost_Info3_String.erase();
	VisitHost_Info4_String.erase();
	VisitHost_Info5_String.erase();
	VisitHost_Info6_String.erase();
	VisitHost_Help_String.erase();
	VisitHost_Back_String.erase();
	VisitHost_Next_String.erase();
	OptionalPatch_Title_String.erase();
	OptionalPatch_Info1_String.erase();
	OptionalPatch_Info2_String.erase();
	OptionalPatch_Info3_String.erase();
	OptionalPatch_Info4_String.erase();
	OptionalPatch_Info5_String.erase();
	OptionalPatch_Info6_String.erase();
	OptionalPatch_ViewDetails_String.erase();
	OptionalPatch_Help_String.erase();
	OptionalPatch_Next_String.erase();
	OptionalPatch_BadDescExe_String.erase();
	OptionalPatch_DescTitle_String.erase();
	OptionalPatch_FetchingDesc_String.erase();
	OptionalPatch_TimedOut_String.erase();
	OptionalPatch_DownloadFailed_String.erase();
	OptionalPatch_Back_String.erase();
	PatchDetails_Title_String.erase();
	PatchDetails_Info1_String.erase();
	PatchDetails_Info2_String.erase();
	PatchDetails_Info3_String.erase();
	PatchDetails_Info4_String.erase();
	PatchDetails_Info5_String.erase();
	PatchDetails_Info6_String.erase();
	PatchDetails_Help_String.erase();
	PatchDetails_Back_String.erase();
	PatchDetails_Next_String.erase();
	PatchDetails_FileTooBig_String.erase();
	PatchDetails_FileTooBigTtl_String.erase();
	VersionCheck_Title_String.erase();
	VersionCheck_Info1_String.erase();
	VersionCheck_Info2_String.erase();
	VersionCheck_Info3_String.erase();
	VersionCheck_Info4_String.erase();
	VersionCheck_Info5_String.erase();
	VersionCheck_Info6_String.erase();
	VersionCheck_Help_String.erase();
	VersionCheck_Next_String.erase();
	VersionCheck_Back_String.erase();
	VersionCheck_OkToGoBack_String.erase();
	VersionCheck_StatusPleaseWait_String.erase();
	VersionCheck_StatusErrorFound_String.erase();
	VersionCheck_StatusFinished_String.erase();
	VersionCheck_DNSTestStarted_String.erase();
	VersionCheck_MotdLookupStarted_String.erase();
	VersionCheck_ServerLookupStarted_String.erase();
	VersionCheck_SelfVersionCheckStarted_String.erase();
	VersionCheck_GameVersionCheckStarted_String.erase();
	VersionCheck_UpToDate_String.erase();
	VersionCheck_Finish_String.erase();
	VersionCheck_CheckingForPatch_String.erase();
	VersionCheck_AbortTitle_String.erase();
	VersionCheck_Visit_String.erase();
	Login_Title_String.erase();
	Login_Info_String.erase();
	Login_Name_String.erase();
	Login_Password_String.erase();
	Login_Ok_String.erase();
}