| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- //
- // 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
|