2016-07-03 14:09:51 +00:00
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers , whose names
* are too numerous to list here . Please refer to the COPYRIGHT
* file distributed with this source distribution .
*
* This program 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 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*
*/
# include "gui/downloaddialog.h"
# include "backends/cloud/cloudmanager.h"
2016-07-10 05:05:00 +00:00
# include "common/config-manager.h"
2016-07-03 14:09:51 +00:00
# include "common/translation.h"
2019-07-15 11:35:24 +00:00
# include "common/util.h"
2016-07-10 05:05:00 +00:00
# include "engines/metaengine.h"
# include "gui/browser.h"
# include "gui/chooser.h"
# include "gui/editgamedialog.h"
2018-01-06 15:13:29 +00:00
# include "gui/gui-manager.h"
2016-07-12 08:00:11 +00:00
# include "gui/launcher.h"
2016-07-10 05:05:00 +00:00
# include "gui/message.h"
# include "gui/remotebrowser.h"
# include "gui/widgets/edittext.h"
# include "gui/widgets/list.h"
2016-07-03 14:09:51 +00:00
namespace GUI {
enum {
2016-07-14 10:53:38 +00:00
kDownloadDialogButtonCmd = ' Dldb '
2016-07-03 14:09:51 +00:00
} ;
2016-07-14 10:53:38 +00:00
DownloadDialog : : DownloadDialog ( uint32 storageId , LauncherDialog * launcher ) :
2016-07-12 08:00:11 +00:00
Dialog ( " GlobalOptions_Cloud_DownloadDialog " ) , _launcher ( launcher ) , _close ( false ) {
2016-07-03 14:09:51 +00:00
_backgroundType = GUI : : ThemeEngine : : kDialogBackgroundPlain ;
2020-07-01 18:01:48 +00:00
_browser = new BrowserDialog ( _ ( " Select directory where to download game data " ) , true ) ;
2016-07-04 07:00:26 +00:00
_remoteBrowser = new RemoteBrowserDialog ( _ ( " Select directory with game data " ) ) ;
2016-07-14 10:53:38 +00:00
2020-07-01 18:01:48 +00:00
_remoteDirectoryLabel = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.RemoteDirectory " , _ ( " From: " ) ) ;
_localDirectoryLabel = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.LocalDirectory " , _ ( " To: " ) ) ;
2016-07-04 11:11:58 +00:00
uint32 progress = ( uint32 ) ( 100 * CloudMan . getDownloadingProgress ( ) ) ;
_progressBar = new SliderWidget ( this , " GlobalOptions_Cloud_DownloadDialog.ProgressBar " ) ;
_progressBar - > setMinValue ( 0 ) ;
_progressBar - > setMaxValue ( 100 ) ;
_progressBar - > setValue ( progress ) ;
_progressBar - > setEnabled ( false ) ;
_percentLabel = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.PercentText " , Common : : String : : format ( " %u %% " , progress ) ) ;
2020-06-13 17:36:08 +00:00
_downloadSizeLabel = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.DownloadSize " , Common : : U32String ( " " ) ) ;
_downloadSpeedLabel = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.DownloadSpeed " , Common : : U32String ( " " ) ) ;
2016-07-14 10:53:38 +00:00
if ( g_system - > getOverlayWidth ( ) > 320 )
2020-07-01 18:01:48 +00:00
_cancelButton = new ButtonWidget ( this , " GlobalOptions_Cloud_DownloadDialog.MainButton " , _ ( " Cancel download " ) , Common : : U32String ( " " ) , kDownloadDialogButtonCmd ) ;
2016-07-04 12:36:47 +00:00
else
2020-07-01 18:01:48 +00:00
_cancelButton = new ButtonWidget ( this , " GlobalOptions_Cloud_DownloadDialog.MainButton " , _c ( " Cancel download " , " lowres " ) , Common : : U32String ( " " ) , kDownloadDialogButtonCmd ) ;
2016-07-14 10:53:38 +00:00
2020-07-01 18:01:48 +00:00
_closeButton = new ButtonWidget ( this , " GlobalOptions_Cloud_DownloadDialog.CloseButton " , _ ( " Hide " ) , Common : : U32String ( " " ) , kCloseCmd ) ;
2016-07-04 12:30:23 +00:00
refreshWidgets ( ) ;
2016-07-14 10:53:38 +00:00
2016-07-04 11:11:58 +00:00
CloudMan . setDownloadTarget ( this ) ;
}
DownloadDialog : : ~ DownloadDialog ( ) {
CloudMan . setDownloadTarget ( nullptr ) ;
}
2016-07-04 12:30:23 +00:00
void DownloadDialog : : open ( ) {
Dialog : : open ( ) ;
2016-07-11 08:24:30 +00:00
CloudMan . setDownloadTarget ( this ) ;
2016-07-04 12:30:23 +00:00
if ( ! CloudMan . isDownloading ( ) )
if ( ! selectDirectories ( ) )
close ( ) ;
reflowLayout ( ) ;
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-04 12:30:23 +00:00
}
2016-07-04 11:11:58 +00:00
void DownloadDialog : : close ( ) {
CloudMan . setDownloadTarget ( nullptr ) ;
Dialog : : close ( ) ;
2016-07-03 14:09:51 +00:00
}
void DownloadDialog : : handleCommand ( CommandSender * sender , uint32 cmd , uint32 data ) {
switch ( cmd ) {
2016-07-14 10:53:38 +00:00
case kDownloadDialogButtonCmd :
2016-07-22 12:48:46 +00:00
{
CloudMan . setDownloadTarget ( nullptr ) ;
CloudMan . cancelDownload ( ) ;
close ( ) ;
break ;
}
2016-07-11 08:24:30 +00:00
case kDownloadProgressCmd :
if ( ! _close ) {
refreshWidgets ( ) ;
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-11 08:24:30 +00:00
}
2016-07-04 11:11:58 +00:00
break ;
case kDownloadEndedCmd :
2016-07-04 12:30:23 +00:00
_close = true ;
2016-07-04 11:11:58 +00:00
break ;
2016-07-03 14:09:51 +00:00
default :
Dialog : : handleCommand ( sender , cmd , data ) ;
}
}
2016-07-04 12:30:23 +00:00
bool DownloadDialog : : selectDirectories ( ) {
2019-06-20 20:14:04 +00:00
if ( g_system - > isConnectionLimited ( ) ) {
2016-07-20 06:14:22 +00:00
MessageDialog alert ( _ ( " It looks like your connection is limited. "
" Do you really want to download files with it? " ) , _ ( " Yes " ) , _ ( " No " ) ) ;
2016-07-22 12:48:46 +00:00
if ( alert . runModal ( ) ! = GUI : : kMessageOK )
return false ;
2016-07-20 06:14:22 +00:00
}
2016-07-21 05:44:36 +00:00
//first user should select remote directory to download
2016-07-22 12:48:46 +00:00
if ( _remoteBrowser - > runModal ( ) < = 0 )
return false ;
2016-07-04 05:52:40 +00:00
2016-07-04 08:49:33 +00:00
Cloud : : StorageFile remoteDirectory = _remoteBrowser - > getResult ( ) ;
2016-07-04 05:52:40 +00:00
//now user should select local directory to download into
2016-07-22 12:48:46 +00:00
if ( _browser - > runModal ( ) < = 0 )
return false ;
2016-07-04 05:52:40 +00:00
Common : : FSNode dir ( _browser - > getResult ( ) ) ;
Common : : FSList files ;
if ( ! dir . getChildren ( files , Common : : FSNode : : kListAll ) ) {
MessageDialog alert ( _ ( " ScummVM couldn't open the specified directory! " ) ) ;
alert . runModal ( ) ;
2016-07-04 12:30:23 +00:00
return false ;
2016-07-04 05:52:40 +00:00
}
2016-07-04 08:49:33 +00:00
//check that there is no file with the remote directory's name in the local one
for ( Common : : FSList : : iterator i = files . begin ( ) ; i ! = files . end ( ) ; + + i ) {
if ( i - > getName ( ) . equalsIgnoreCase ( remoteDirectory . name ( ) ) ) {
//if there is, ask user whether it's OK
if ( ! i - > isDirectory ( ) ) {
GUI : : MessageDialog alert ( _ ( " Cannot create a directory to download - the specified directory has a file with the same name. " ) , _ ( " OK " ) ) ;
alert . runModal ( ) ;
2016-07-04 12:30:23 +00:00
return false ;
2016-07-04 08:49:33 +00:00
}
GUI : : MessageDialog alert (
2020-06-20 18:04:23 +00:00
Common : : U32String : : format ( _ ( " The \" %s \" already exists in the specified directory. \n Do you really want to download files into that directory? " ) , remoteDirectory . name ( ) . c_str ( ) ) ,
2016-07-04 08:49:33 +00:00
_ ( " Yes " ) ,
_ ( " No " )
2016-07-14 10:53:38 +00:00
) ;
2016-07-22 12:48:46 +00:00
if ( alert . runModal ( ) ! = GUI : : kMessageOK )
return false ;
2016-07-04 08:49:33 +00:00
break ;
}
}
2016-07-04 05:52:40 +00:00
2016-07-04 09:34:02 +00:00
//make a local path
Common : : String localPath = dir . getPath ( ) ;
//simple heuristic to determine which path separator to use
2016-07-04 11:26:16 +00:00
if ( localPath . size ( ) & & localPath . lastChar ( ) ! = ' / ' & & localPath . lastChar ( ) ! = ' \\ ' ) {
int backslashes = 0 ;
for ( uint32 i = 0 ; i < localPath . size ( ) ; + + i )
2016-07-22 12:48:46 +00:00
if ( localPath [ i ] = = ' / ' )
- - backslashes ;
else if ( localPath [ i ] = = ' \\ ' )
+ + backslashes ;
2016-09-05 16:08:51 +00:00
if ( backslashes > 0 )
localPath + = ' \\ ' + remoteDirectory . name ( ) ;
else
localPath + = ' / ' + remoteDirectory . name ( ) ;
2016-07-22 12:48:46 +00:00
} else {
localPath + = remoteDirectory . name ( ) ;
}
2016-07-04 09:34:02 +00:00
2016-07-04 10:14:30 +00:00
CloudMan . startDownload ( remoteDirectory . path ( ) , localPath ) ;
2016-07-04 11:11:58 +00:00
CloudMan . setDownloadTarget ( this ) ;
2016-07-10 05:05:00 +00:00
_localDirectory = localPath ;
2016-07-04 12:30:23 +00:00
return true ;
2016-07-04 05:52:40 +00:00
}
2016-07-03 14:09:51 +00:00
void DownloadDialog : : handleTickle ( ) {
2016-07-04 12:30:23 +00:00
if ( _close ) {
2016-07-12 08:00:11 +00:00
if ( _launcher )
_launcher - > doGameDetection ( _localDirectory ) ;
2016-07-04 12:30:23 +00:00
close ( ) ;
_close = false ;
return ;
}
2016-09-05 06:18:22 +00:00
int32 progress = ( int32 ) ( 100 * CloudMan . getDownloadingProgress ( ) ) ;
2016-07-14 04:17:26 +00:00
if ( _progressBar - > getValue ( ) ! = progress ) {
refreshWidgets ( ) ;
2018-01-06 15:13:29 +00:00
g_gui . scheduleTopDialogRedraw ( ) ;
2016-07-14 04:17:26 +00:00
}
2016-07-03 14:09:51 +00:00
Dialog : : handleTickle ( ) ;
}
void DownloadDialog : : reflowLayout ( ) {
Dialog : : reflowLayout ( ) ;
2016-07-04 12:30:23 +00:00
refreshWidgets ( ) ;
2016-07-03 14:09:51 +00:00
}
2020-06-13 16:42:25 +00:00
Common : : U32String DownloadDialog : : getSizeLabelText ( ) {
2016-07-14 10:53:38 +00:00
Common : : String downloaded , downloadedUnits , total , totalUnits ;
downloaded = getHumanReadableBytes ( CloudMan . getDownloadBytesNumber ( ) , downloadedUnits ) ;
total = getHumanReadableBytes ( CloudMan . getDownloadTotalBytesNumber ( ) , totalUnits ) ;
2020-08-19 19:32:51 +00:00
return Common : : U32String : : format ( _ ( " Downloaded %s %S / %s %S " ) , downloaded . c_str ( ) , _ ( downloadedUnits ) . c_str ( ) , total . c_str ( ) , _ ( totalUnits ) . c_str ( ) ) ;
2016-07-14 10:53:38 +00:00
}
2020-06-13 16:42:25 +00:00
Common : : U32String DownloadDialog : : getSpeedLabelText ( ) {
2016-07-14 10:53:38 +00:00
Common : : String speed , speedUnits ;
speed = getHumanReadableBytes ( CloudMan . getDownloadSpeed ( ) , speedUnits ) ;
speedUnits + = " /s " ;
2020-08-19 19:32:51 +00:00
return Common : : U32String : : format ( _ ( " Download speed: %s %S " ) , speed . c_str ( ) , _ ( speedUnits ) . c_str ( ) ) ;
2016-07-14 10:53:38 +00:00
}
2016-07-21 05:44:36 +00:00
void DownloadDialog : : refreshWidgets ( ) {
2016-07-10 05:05:00 +00:00
_localDirectory = CloudMan . getDownloadLocalDirectory ( ) ;
2020-06-29 22:10:13 +00:00
_remoteDirectoryLabel - > setLabel ( _ ( " From: " ) + Common : : U32String ( CloudMan . getDownloadRemoteDirectory ( ) ) ) ;
_localDirectoryLabel - > setLabel ( _ ( " To: " ) + Common : : U32String ( _localDirectory ) ) ;
2016-07-04 12:30:23 +00:00
uint32 progress = ( uint32 ) ( 100 * CloudMan . getDownloadingProgress ( ) ) ;
2016-07-14 10:53:38 +00:00
_percentLabel - > setLabel ( Common : : String : : format ( " %u %% " , progress ) ) ;
_downloadSizeLabel - > setLabel ( getSizeLabelText ( ) ) ;
_downloadSpeedLabel - > setLabel ( getSpeedLabelText ( ) ) ;
2016-07-04 12:30:23 +00:00
_progressBar - > setValue ( progress ) ;
2016-07-03 14:09:51 +00:00
}
} // End of namespace GUI