Browse Source

- Handle paths with (~, ., ..) properly

adaptive-webui-19844
Christophe Dumez 15 years ago
parent
commit
50e620daf2
  1. 4
      src/bittorrent.cpp
  2. 17
      src/misc.h
  3. 58
      src/options_imp.cpp
  4. 10
      src/propertieswidget.cpp
  5. 11
      src/torrentadditiondlg.h

4
src/bittorrent.cpp

@ -1836,11 +1836,13 @@ QString Bittorrent::getSavePath(QString hash) {
} }
qDebug("getSavePath, got save_path from persistent data: %s", savePath.toLocal8Bit().data()); qDebug("getSavePath, got save_path from persistent data: %s", savePath.toLocal8Bit().data());
} }
// Clean path
savePath = misc::expandPath(savePath);
// Checking if savePath Dir exists // Checking if savePath Dir exists
// create it if it is not // create it if it is not
QDir saveDir(savePath); QDir saveDir(savePath);
if(!saveDir.exists()) { if(!saveDir.exists()) {
if(!saveDir.mkpath(saveDir.path())) { if(!saveDir.mkpath(saveDir.absolutePath())) {
std::cerr << "Couldn't create the save directory: " << saveDir.path().toLocal8Bit().data() << "\n"; std::cerr << "Couldn't create the save directory: " << saveDir.path().toLocal8Bit().data() << "\n";
// XXX: Do something else? // XXX: Do something else?
} }

17
src/misc.h

@ -317,6 +317,23 @@ public:
return QDateTime::fromTime_t(mktime(&tm)).toString(Qt::DefaultLocaleLongDate); return QDateTime::fromTime_t(mktime(&tm)).toString(Qt::DefaultLocaleLongDate);
} }
// Replace ~ in path
static QString expandPath(QString path) {
path = path.trimmed();
if(path.isEmpty()) return path;
if(path.length() == 1) {
if(path[0] == '~' ) return QDir::homePath();
}
if(path[0] == '~' && path[1] == QDir::separator()) {
path = path.replace(0, 1, QDir::homePath());
} else {
if(QDir::isAbsolutePath(path)) {
path = QDir(path).absolutePath();
}
}
return QDir::cleanPath(path);
}
// Take a number of seconds and return an user-friendly // Take a number of seconds and return an user-friendly
// time duration like "1d 2h 10m". // time duration like "1d 2h 10m".
static QString userFriendlyDuration(qlonglong seconds) { static QString userFriendlyDuration(qlonglong seconds) {

58
src/options_imp.cpp

@ -921,11 +921,11 @@ QString options_imp::getSavePath() const{
if(textSavePath->text().trimmed().isEmpty()){ if(textSavePath->text().trimmed().isEmpty()){
textSavePath->setText(home+QString::fromUtf8("qBT_dir")); textSavePath->setText(home+QString::fromUtf8("qBT_dir"));
} }
return textSavePath->text(); return misc::expandPath(textSavePath->text());
} }
QString options_imp::getTempPath() const { QString options_imp::getTempPath() const {
return textTempPath->text(); return misc::expandPath(textTempPath->text());
} }
bool options_imp::isTempPathEnabled() const { bool options_imp::isTempPathEnabled() const {
@ -1310,9 +1310,9 @@ void options_imp::setLocale(QString locale){
// Return scan dir set in options // Return scan dir set in options
QString options_imp::getScanDir() const { QString options_imp::getScanDir() const {
if(checkScanDir->isChecked()){ if(checkScanDir->isChecked()){
return textScanDir->text().trimmed(); return misc::expandPath(textScanDir->text());
}else{ }else{
return QString(); return QString::null;
} }
} }
@ -1332,22 +1332,28 @@ int options_imp::getActionOnDblClOnTorrentFn() const {
// Display dialog to choose scan dir // Display dialog to choose scan dir
void options_imp::on_browseScanDirButton_clicked() { void options_imp::on_browseScanDirButton_clicked() {
#ifdef Q_WS_WIN QString scan_path = misc::expandPath(textScanDir->text());
QString dir = QFileDialog::getExistingDirectory(this, tr("Choose scan directory"), QDir::rootPath()); QDir scanDir(scan_path);
#else QString dir;
QString dir = QFileDialog::getExistingDirectory(this, tr("Choose scan directory"), QDir::homePath()); if(!scan_path.isEmpty() && scanDir.exists()) {
#endif dir = QFileDialog::getExistingDirectory(this, tr("Choose scan directory"), scanDir.absolutePath());
} else {
dir = QFileDialog::getExistingDirectory(this, tr("Choose scan directory"), QDir::homePath());
}
if(!dir.isNull()){ if(!dir.isNull()){
textScanDir->setText(dir); textScanDir->setText(dir);
} }
} }
void options_imp::on_browseFilterButton_clicked() { void options_imp::on_browseFilterButton_clicked() {
#ifdef Q_WS_WIN QString filter_path = misc::expandPath(textFilterPath->text());
QString ipfilter = QFileDialog::getOpenFileName(this, tr("Choose an ip filter file"), QDir::rootPath(), tr("Filters")+QString(" (*.dat *.p2p *.p2b)")); QDir filterDir(filter_path);
#else QString ipfilter;
QString ipfilter = QFileDialog::getOpenFileName(this, tr("Choose an ip filter file"), QDir::homePath(), tr("Filters")+QString(" (*.dat *.p2p *.p2b)")); if(!filter_path.isEmpty() && filterDir.exists()) {
#endif ipfilter = QFileDialog::getOpenFileName(this, tr("Choose an ip filter file"), filterDir.absolutePath(), tr("Filters")+QString(" (*.dat *.p2p *.p2b)"));
} else {
ipfilter = QFileDialog::getOpenFileName(this, tr("Choose an ip filter file"), QDir::homePath(), tr("Filters")+QString(" (*.dat *.p2p *.p2b)"));
}
if(!ipfilter.isNull()){ if(!ipfilter.isNull()){
textFilterPath->setText(ipfilter); textFilterPath->setText(ipfilter);
} }
@ -1355,20 +1361,28 @@ void options_imp::on_browseFilterButton_clicked() {
// Display dialog to choose save dir // Display dialog to choose save dir
void options_imp::on_browseSaveDirButton_clicked(){ void options_imp::on_browseSaveDirButton_clicked(){
QString def_path = QDir::homePath(); QString save_path = misc::expandPath(textSavePath->text());
if(!textSavePath->text().isEmpty()) QDir saveDir(save_path);
def_path = textSavePath->text(); QString dir;
QString dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), def_path); if(!save_path.isEmpty() && saveDir.exists()) {
dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), saveDir.absolutePath());
} else {
dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), QDir::homePath());
}
if(!dir.isNull()){ if(!dir.isNull()){
textSavePath->setText(dir); textSavePath->setText(dir);
} }
} }
void options_imp::on_browseTempDirButton_clicked(){ void options_imp::on_browseTempDirButton_clicked(){
QString def_path = QDir::homePath(); QString temp_path = misc::expandPath(textTempPath->text());
if(!textTempPath->text().isEmpty()) QDir tempDir(temp_path);
def_path = textTempPath->text(); QString dir;
QString dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), def_path); if(!temp_path.isEmpty() && tempDir.exists()) {
dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), tempDir.absolutePath());
} else {
dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), QDir::homePath());
}
if(!dir.isNull()){ if(!dir.isNull()){
textTempPath->setText(dir); textTempPath->setText(dir);
} }

10
src/propertieswidget.cpp

@ -636,20 +636,20 @@ void PropertiesWidget::renameSelectedFile() {
} }
if(!dir.isNull()){ if(!dir.isNull()){
// Check if savePath exists // Check if savePath exists
QDir savePath(dir); QDir savePath(misc::expandPath(dir));
if(!savePath.exists()){ if(!savePath.exists()){
if(!savePath.mkpath(savePath.path())){ if(!savePath.mkpath(savePath.absolutePath())){
QMessageBox::critical(0, tr("Save path creation error"), tr("Could not create the save path")); QMessageBox::critical(0, tr("Save path creation error"), tr("Could not create the save path"));
return; return;
} }
} }
// Save savepath // Save savepath
TorrentPersistentData::saveSavePath(h.hash(), savePath.path()); TorrentPersistentData::saveSavePath(h.hash(), savePath.absolutePath());
// Actually move storage // Actually move storage
if(!BTSession->useTemporaryFolder() || h.is_seed()) if(!BTSession->useTemporaryFolder() || h.is_seed())
h.move_storage(savePath.path()); h.move_storage(savePath.absolutePath());
// Update save_path in dialog // Update save_path in dialog
save_path->setText(savePath.path()); save_path->setText(savePath.absolutePath());
} }
} }

11
src/torrentadditiondlg.h

@ -205,7 +205,7 @@ public:
public slots: public slots:
void updateDiskSpaceLabels() { void updateDiskSpaceLabels() {
long long available = misc::freeDiskSpaceOnPath(savePathTxt->text()); long long available = misc::freeDiskSpaceOnPath(misc::expandPath(savePathTxt->text()));
lbl_disk_space->setText(misc::friendlyUnit(available)); lbl_disk_space->setText(misc::friendlyUnit(available));
// Determine torrent size // Determine torrent size
@ -235,9 +235,10 @@ public slots:
void on_browseButton_clicked(){ void on_browseButton_clicked(){
QString dir; QString dir;
QDir saveDir(savePathTxt->text()); QString save_path = misc::expandPath(savePathTxt->text());
if(saveDir.exists()){ QDir saveDir(save_path);
dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), savePathTxt->text()); if(!save_path.isEmpty() && saveDir.exists()){
dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), saveDir.absolutePath());
}else{ }else{
dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), QDir::homePath()); dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), QDir::homePath());
} }
@ -261,11 +262,11 @@ public slots:
} }
void on_OkButton_clicked(){ void on_OkButton_clicked(){
QDir savePath(savePathTxt->text());
if(savePathTxt->text().trimmed().isEmpty()){ if(savePathTxt->text().trimmed().isEmpty()){
QMessageBox::critical(0, tr("Empty save path"), tr("Please enter a save path")); QMessageBox::critical(0, tr("Empty save path"), tr("Please enter a save path"));
return; return;
} }
QDir savePath(misc::expandPath(savePathTxt->text()));
// Check if savePath exists // Check if savePath exists
if(!savePath.exists()){ if(!savePath.exists()){
if(!savePath.mkpath(savePath.path())){ if(!savePath.mkpath(savePath.path())){

Loading…
Cancel
Save