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-20 06:14:22 +00:00
# include "backends/networking/connection/islimited.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"
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 ;
2016-07-04 05:52:40 +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
2016-07-04 11:11:58 +00:00
_remoteDirectoryLabel = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.RemoteDirectory " , _ ( " From: " ) ) ;
_localDirectoryLabel = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.LocalDirectory " , _ ( " To: " ) ) ;
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 ) ) ;
2016-07-14 10:53:38 +00:00
_downloadSizeLabel = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.DownloadSize " , " " ) ;
_downloadSpeedLabel = new StaticTextWidget ( this , " GlobalOptions_Cloud_DownloadDialog.DownloadSpeed " , " " ) ;
if ( g_system - > getOverlayWidth ( ) > 320 )
2016-07-04 12:36:47 +00:00
_cancelButton = new ButtonWidget ( this , " GlobalOptions_Cloud_DownloadDialog.MainButton " , _ ( " Cancel download " ) , 0 , kDownloadDialogButtonCmd ) ;
else
_cancelButton = new ButtonWidget ( this , " GlobalOptions_Cloud_DownloadDialog.MainButton " , _c ( " Cancel download " , " lowres " ) , 0 , kDownloadDialogButtonCmd ) ;
2016-07-14 10:53:38 +00:00
2016-07-14 08:19:04 +00:00
_closeButton = new ButtonWidget ( this , " GlobalOptions_Cloud_DownloadDialog.CloseButton " , _ ( " Hide " ) , 0 , 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 ( ) {
2016-07-20 06:14:22 +00:00
if ( Networking : : Connection : : isLimited ( ) ) {
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 (
Common : : String : : format ( _ ( " The \" %s \" already exists in the specified directory. \n Do you really want to download files into that directory? " ) , remoteDirectory . name ( ) . c_str ( ) ) ,
_ ( " 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
}
2016-07-14 10:53:38 +00:00
namespace {
Common : : String getHumanReadableBytes ( uint64 bytes , Common : : String & unitsOut ) {
2016-07-22 11:15:06 +00:00
Common : : String result = Common : : String : : format ( " %lu " , bytes ) ;
2016-07-14 10:53:38 +00:00
unitsOut = " B " ;
if ( bytes > = 1024 ) {
bytes / = 1024 ;
2016-07-22 11:15:06 +00:00
result = Common : : String : : format ( " %lu " , bytes ) ;
2016-07-14 10:53:38 +00:00
unitsOut = " KB " ;
}
double floating = bytes ;
if ( bytes > = 1024 ) {
bytes / = 1024 ;
floating / = 1024.0 ;
unitsOut = " MB " ;
}
if ( bytes > = 1024 ) {
bytes / = 1024 ;
floating / = 1024.0 ;
unitsOut = " GB " ;
}
if ( bytes > = 1024 ) { // woah
bytes / = 1024 ;
floating / = 1024.0 ;
unitsOut = " TB " ;
}
// print one digit after floating point
2016-09-05 06:18:22 +00:00
result = Common : : String : : format ( " %.1f " , floating ) ;
2016-07-14 10:53:38 +00:00
return result ;
}
}
Common : : String DownloadDialog : : getSizeLabelText ( ) {
Common : : String downloaded , downloadedUnits , total , totalUnits ;
downloaded = getHumanReadableBytes ( CloudMan . getDownloadBytesNumber ( ) , downloadedUnits ) ;
total = getHumanReadableBytes ( CloudMan . getDownloadTotalBytesNumber ( ) , totalUnits ) ;
return Common : : String : : format ( _ ( " Downloaded %s %s / %s %s " ) , downloaded . c_str ( ) , _ ( downloadedUnits . c_str ( ) ) , total . c_str ( ) , _ ( totalUnits . c_str ( ) ) ) ;
}
Common : : String DownloadDialog : : getSpeedLabelText ( ) {
Common : : String speed , speedUnits ;
speed = getHumanReadableBytes ( CloudMan . getDownloadSpeed ( ) , speedUnits ) ;
speedUnits + = " /s " ;
2016-09-05 08:17:03 +00:00
return Common : : String : : 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 ( ) ;
2016-07-04 12:30:23 +00:00
_remoteDirectoryLabel - > setLabel ( _ ( " From: " ) + CloudMan . getDownloadRemoteDirectory ( ) ) ;
2016-07-10 05:05:00 +00:00
_localDirectoryLabel - > setLabel ( _ ( " To: " ) + _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