CnC_Remastered_Collection/REDALERT/WOL_DNLD.CPP
PG-SteveT 03416d24e1 Initial Source Code commit
Initial commit of original Tiberian Dawn and Red Alert source code converted to build as DLLs, and compatible with the release version of Command & Conquer Remastered.
2020-05-27 12:16:20 -07:00

261 lines
7.3 KiB
C++

//
// Copyright 2020 Electronic Arts Inc.
//
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
// software: you can redistribute it and/or modify it under the terms of
// the GNU General Public License as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version.
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
// in the hope that it will be useful, but with permitted additional restrictions
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
// distributed with this program. You should have received a copy of the
// GNU General Public License along with permitted additional restrictions
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
#ifdef WOLAPI_INTEGRATION
// Wol_Dnld.cpp - WW online patch download dialog.
// ajw 10/12/98
#include "function.h"
#include "WolapiOb.h"
#include "WolStrng.h"
//***********************************************************************************************
bool WOL_Download_Dialog( IDownload* pDownload, RADownloadEventSink* pDownloadSink, const char* szTitle )
{
// This dialog is presented for each file that is to be downloaded during a WOLAPI patch.
bool bReturn = true;
DWORD dwTimeNextPump = ::timeGetTime() + WOLAPIPUMPWAIT;
/*
** Dialog & button dimensions
*/
int d_dialog_w = 200*RESFACTOR; // dialog width
int d_dialog_h = 90*RESFACTOR; // dialog height
int d_dialog_x = ((320*RESFACTOR - d_dialog_w) / 2); // dialog x-coord
int d_dialog_y = ((200*RESFACTOR - d_dialog_h) / 2); // centered y-coord
int d_dialog_cx = d_dialog_x + (d_dialog_w / 2); // center x-coord
int d_margin = 34;
int d_txt6_h = 15;
#if (GERMAN | FRENCH)
int d_cancel_w = 50*RESFACTOR;
#else
int d_cancel_w = 40*RESFACTOR;
#endif
int d_cancel_h = 9*RESFACTOR;
int d_cancel_x = d_dialog_cx - d_cancel_w / 2;
int d_cancel_y = d_dialog_y + d_dialog_h - 20*RESFACTOR;
int d_progress_w = 100*RESFACTOR;
int d_progress_h = 10*RESFACTOR;
int d_progress_x = (SeenBuff.Get_Width()/2) - d_progress_w/2;
int d_progress_y = d_dialog_y + 45*RESFACTOR;
// int width;
// int height;
// char* info_string = (char*)szTitle;
Fancy_Text_Print( TXT_NONE, 0, 0, GadgetClass::Get_Color_Scheme(),
TBLACK, TPF_CENTER|TPF_6PT_GRAD|TPF_USE_GRAD_PAL|TPF_NOSHADOW );
// Format_Window_String( info_string, SeenBuff.Get_Height(), width, height );
/*
** Button Enumerations
*/
enum {
BUTTON_CANCEL = 100,
BUTTON_PROGRESS
};
/*
** Buttons
*/
TextButtonClass cancelbtn( BUTTON_CANCEL, TXT_CANCEL, TPF_CENTER | TPF_6PT_GRAD | TPF_USE_GRAD_PAL | TPF_NOSHADOW,
#if (GERMAN | FRENCH)
d_cancel_x, d_cancel_y );
#else
d_cancel_x, d_cancel_y, d_cancel_w, d_cancel_h );
#endif
GaugeClass progress_meter( BUTTON_PROGRESS, d_progress_x, d_progress_y, d_progress_w, d_progress_h );
progress_meter.Use_Thumb( 0 );
StaticButtonClass StatTitle( 0, szTitle, TPF_CENTER|TPF_TEXT, d_dialog_x + d_margin, d_dialog_y + 28, d_dialog_w - 2 * d_margin, d_txt6_h );
StaticButtonClass StatStatus( 0, "", TPF_CENTER|TPF_TEXT, d_dialog_x + d_margin, d_dialog_y + 49, d_dialog_w - 2 * d_margin, d_txt6_h );
StaticButtonClass StatBytes( 0, "", TPF_CENTER|TPF_TEXT, d_dialog_x + d_margin, d_dialog_y + 71, d_dialog_w - 2 * d_margin, d_txt6_h );
StaticButtonClass StatTime( 0, "", TPF_CENTER|TPF_TEXT, d_dialog_x + d_margin, d_dialog_y + 117, d_dialog_w - 2 * d_margin, d_txt6_h );
typedef enum {
REDRAW_NONE = 0,
REDRAW_PROGRESS,
REDRAW_BUTTONS,
REDRAW_BACKGROUND,
REDRAW_ALL = REDRAW_BACKGROUND
} RedrawType;
bool process = true;
RedrawType display = REDRAW_ALL; // redraw level
KeyNumType input;
GadgetClass* commands; // button list
commands = &cancelbtn;
progress_meter.Add_Tail(*commands);
StatTitle.Add_Tail(*commands);
StatBytes.Add_Tail(*commands);
StatTime.Add_Tail(*commands);
StatStatus.Add_Tail(*commands);
progress_meter.Set_Maximum(100); // Max is 100%
progress_meter.Set_Value(0); // Current is 0%
do {
#ifdef WIN32
/*
** If we have just received input focus again after running in the background then
** we need to redraw.
*/
if (AllSurfaces.SurfacesRestored) {
AllSurfaces.SurfacesRestored=FALSE;
display = REDRAW_ALL;
}
#endif
if (display){
if (display >= REDRAW_BACKGROUND){
Hide_Mouse();
/*
** Redraw backgound & dialog box
*/
Load_Title_Page(true);
Set_Palette(CCPalette);
Dialog_Box(d_dialog_x, d_dialog_y, d_dialog_w, d_dialog_h);
/*
** Dialog & Field labels
*/
Draw_Caption (TXT_NONE, d_dialog_x, d_dialog_y, d_dialog_w);
// Fancy_Text_Print(info_string, d_dialog_cx-width/2, d_dialog_y + 25*RESFACTOR,
// GadgetClass::Get_Color_Scheme(), TBLACK,
// TPF_6PT_GRAD | TPF_USE_GRAD_PAL | TPF_NOSHADOW);
Show_Mouse();
}
if (display >= REDRAW_BUTTONS){
commands->Draw_All();
}
if (display >= REDRAW_PROGRESS){
progress_meter.Draw_Me(true);
}
display = REDRAW_NONE;
}
if (process){
input = cancelbtn.Input();
switch (input) {
/*
** Cancel. Just return to the main menu
*/
case (KN_ESC):
case (BUTTON_CANCEL | KN_BUTTON):
pDownload->Abort();
process = false;
bReturn = false;
break;
}
}
if( ::timeGetTime() > dwTimeNextPump )
{
pDownload->PumpMessages();
if( pDownloadSink->bFlagEnd )
{
pDownloadSink->bFlagEnd = false;
process = false;
break;
}
if( pDownloadSink->bFlagError )
{
WWMessageBox().Process( TXT_WOL_DOWNLOADERROR );
pDownloadSink->bFlagError = false;
process = false;
bReturn = false;
break;
}
if( pDownloadSink->bFlagProgressUpdate )
{
pDownloadSink->bFlagProgressUpdate = false;
progress_meter.Set_Value( ( pDownloadSink->iBytesRead * 100 ) / pDownloadSink->iTotalSize );
char szText[200];
sprintf( szText, TXT_WOL_DOWNLOADBYTES, pDownloadSink->iBytesRead, pDownloadSink->iTotalSize,
( pDownloadSink->iBytesRead * 100 ) / pDownloadSink->iTotalSize );
StatBytes.Set_Text( szText );
sprintf( szText, TXT_WOL_DOWNLOADTIME, pDownloadSink->iTimeLeft / 60, pDownloadSink->iTimeLeft % 60 );
StatTime.Set_Text( szText );
if( display < REDRAW_BUTTONS ) display = REDRAW_BUTTONS;
}
if( pDownloadSink->bFlagStatusUpdate )
{
pDownloadSink->bFlagStatusUpdate = false;
switch( pDownloadSink->iStatus )
{
case DOWNLOADSTATUS_CONNECTING:
StatStatus.Set_Text( TXT_WOL_DOWNLOADCONNECTING );
break;
case DOWNLOADSTATUS_FINDINGFILE:
StatStatus.Set_Text( TXT_WOL_DOWNLOADLOCATING );
break;
case DOWNLOADSTATUS_DOWNLOADING:
StatStatus.Set_Text( TXT_WOL_DOWNLOADDOWNLOADING );
break;
default:
// debugprint( "Unknown status update!\n" );
break;
}
if( display < REDRAW_BUTTONS ) display = REDRAW_BUTTONS;
}
if( pDownloadSink->bFlagQueryResume )
{
if( pDownloadSink->bResumed )
{
char szTitleNew[200];
sprintf( szTitleNew, TXT_WOL_DOWNLOADRESUMED, szTitle );
StatTitle.Set_Text( szTitleNew );
if( display < REDRAW_BUTTONS ) display = REDRAW_BUTTONS;
}
}
dwTimeNextPump = ::timeGetTime() + WOLAPIPUMPWAIT;
}
// Invoke game callback
Call_Back();
} while ( process );
return bReturn;
}
#endif