From 7f315029724772771771e9d58f6df2104f1ee182 Mon Sep 17 00:00:00 2001 From: manongjohn Date: Dec 03 2019 04:59:36 +0000 Subject: Block saving reserved file names --- diff --git a/toonz/sources/include/toonzqt/gutil.h b/toonz/sources/include/toonzqt/gutil.h index 4dd4ce7..ba509be 100644 --- a/toonz/sources/include/toonzqt/gutil.h +++ b/toonz/sources/include/toonzqt/gutil.h @@ -117,6 +117,8 @@ QString DVAPI toQString(const TFilePath &path); bool DVAPI isSpaceString(const QString &str); bool DVAPI isValidFileName(const QString &fileName); bool DVAPI isValidFileName_message(const QString &fileName); +bool DVAPI isReservedFileName(const QString &fileName); +bool DVAPI isReservedFileName_message(const QString &fileName); QString DVAPI elideText(const QString &columnName, const QFont &font, int width); diff --git a/toonz/sources/toonz/cellselectioncommand.cpp b/toonz/sources/toonz/cellselectioncommand.cpp index 918f4ed..7a94a49 100644 --- a/toonz/sources/toonz/cellselectioncommand.cpp +++ b/toonz/sources/toonz/cellselectioncommand.cpp @@ -1451,7 +1451,8 @@ bool CloneLevelUndo::chooseLevelName(TFilePath &fp) const { if (levelNamePopup->exec() == QDialog::Accepted) { const QString &levelName = levelNamePopup->getName(); - if (isValidFileName_message(levelName)) { + if (isValidFileName_message(levelName) && + !isReservedFileName_message(levelName)) { fp = fp.withName(levelName.toStdWString()); return true; } diff --git a/toonz/sources/toonz/exportlevelpopup.cpp b/toonz/sources/toonz/exportlevelpopup.cpp index 13a6ac8..6d85bae 100644 --- a/toonz/sources/toonz/exportlevelpopup.cpp +++ b/toonz/sources/toonz/exportlevelpopup.cpp @@ -658,6 +658,9 @@ bool ExportLevelPopup::execute() { return false; } + if (isReservedFileName_message(QString::fromStdString(fp.getName()))) + return false; + return IoCmd::exportLevel(fp.withType(ext).withFrame(), 0, opts); } } diff --git a/toonz/sources/toonz/filebrowser.cpp b/toonz/sources/toonz/filebrowser.cpp index c5c2bc2..edcc53a 100644 --- a/toonz/sources/toonz/filebrowser.cpp +++ b/toonz/sources/toonz/filebrowser.cpp @@ -1646,6 +1646,7 @@ void RenameAsToonzPopup::onOk() { "characters:(new line) \\ / : * ? \" |")); return; } + if (isReservedFileName_message(m_name->text())) return; accept(); } diff --git a/toonz/sources/toonz/filebrowserpopup.cpp b/toonz/sources/toonz/filebrowserpopup.cpp index 80de457..8b4f296 100644 --- a/toonz/sources/toonz/filebrowserpopup.cpp +++ b/toonz/sources/toonz/filebrowserpopup.cpp @@ -224,6 +224,7 @@ void FileBrowserPopup::onOkPressed() { "following characters:\n \\ / : * ? \" < > |")); return; } + if (isReservedFileName_message(QFileInfo(str).baseName())) return; m_selectedPaths.clear(); if (!m_isDirectoryOnly) diff --git a/toonz/sources/toonz/levelcreatepopup.cpp b/toonz/sources/toonz/levelcreatepopup.cpp index 901e0ae..dedd032 100644 --- a/toonz/sources/toonz/levelcreatepopup.cpp +++ b/toonz/sources/toonz/levelcreatepopup.cpp @@ -452,6 +452,9 @@ bool LevelCreatePopup::apply() { return false; } + if (isReservedFileName_message(QString::fromStdWString(levelName))) + return false; + if (from > to) { error(tr("Invalid frame range")); return false; diff --git a/toonz/sources/toonz/outputsettingspopup.cpp b/toonz/sources/toonz/outputsettingspopup.cpp index a086e66..b799a05 100644 --- a/toonz/sources/toonz/outputsettingspopup.cpp +++ b/toonz/sources/toonz/outputsettingspopup.cpp @@ -933,6 +933,16 @@ void OutputSettingsPopup::onNameChanged() { return; } + if (isReservedFileName_message(name)) { + TOutputProperties *prop = getProperties(); + TFilePath fp = prop->getPath(); + QString name = QString::fromStdString(fp.getName()); + if (name.isEmpty()) + name = QString::fromStdString(scene->getScenePath().getName()); + m_fileNameFld->setText(name); + + return; + } std::wstring wname = name.toStdWString(); { diff --git a/toonz/sources/toonz/projectpopup.cpp b/toonz/sources/toonz/projectpopup.cpp index 9c09f01..e2278ee 100644 --- a/toonz/sources/toonz/projectpopup.cpp +++ b/toonz/sources/toonz/projectpopup.cpp @@ -584,6 +584,10 @@ void ProjectCreatePopup::createProject() { return; } + if (isReservedFileName_message(fi.baseName())) { + return; + } + TProjectManager *pm = TProjectManager::instance(); TFilePath projectName = TFilePath(m_nameFld->text().toStdWString()); if (projectName == TFilePath()) { diff --git a/toonz/sources/toonzqt/gutil.cpp b/toonz/sources/toonzqt/gutil.cpp index 6e32a86..92ccfa8 100644 --- a/toonz/sources/toonzqt/gutil.cpp +++ b/toonz/sources/toonzqt/gutil.cpp @@ -314,6 +314,33 @@ bool isValidFileName_message(const QString &fileName) { //----------------------------------------------------------------------------- +bool isReservedFileName(const QString &fileName) { +#ifdef _WIN32 + std::vector invalidNames{ + "AUX", "CON", "NUL", "PRN", "COM1", "COM2", "COM3", "COM4", + "COM5", "COM6", "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", + "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"}; + + if (std::find(invalidNames.begin(), invalidNames.end(), fileName) != + invalidNames.end()) + return true; +#endif + + return false; +} + +//----------------------------------------------------------------------------- + +bool isReservedFileName_message(const QString &fileName) { + return isReservedFileName(fileName) + ? (DVGui::error(QObject::tr( + "That is a reserved file name and cannot be used.")), + true) + : false; +} + +//----------------------------------------------------------------------------- + QString elideText(const QString &srcText, const QFont &font, int width) { QFontMetrics metrix(font); int srcWidth = metrix.width(srcText);