Skip to content

Commit ce02208

Browse files
committed
Handle document extension signle place and handle asics
IB-8624 Signed-off-by: Raul Metsma <[email protected]>
1 parent 62f084e commit ce02208

File tree

9 files changed

+69
-98
lines changed

9 files changed

+69
-98
lines changed

client/CryptoDoc.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ bool CDocumentModel::addFile(const QString &file, const QString &mime)
122122
}
123123

124124
auto data = std::make_unique<QFile>(file);
125-
data->open(QFile::ReadOnly);
125+
if(!data->open(QFile::ReadOnly))
126+
return false;
126127
d->cdoc->files.push_back({
127128
QFileInfo(file).fileName(),
128129
QStringLiteral("D%1").arg(d->cdoc->files.size()),
@@ -209,12 +210,11 @@ QString CDocumentModel::save(int row, const QString &path) const
209210
if(d->isEncrypted)
210211
return {};
211212

212-
int zone = FileDialog::fileZone(d->fileName);
213213
QString fileName = copy(row, path);
214214
QFileInfo f(fileName);
215215
if(!f.exists())
216216
return {};
217-
FileDialog::setFileZone(fileName, zone);
217+
FileDialog::setFileZone(fileName, d->fileName);
218218
return fileName;
219219
}
220220

client/DigiDoc.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,9 +390,8 @@ QString SDocumentModel::save(int row, const QString &path) const
390390
return {};
391391

392392
QFile::remove( path );
393-
int zone = FileDialog::fileZone(doc->fileName());
394393
doc->b->dataFiles().at(size_t(row))->saveAs(path.toStdString());
395-
FileDialog::setFileZone(path, zone);
394+
FileDialog::setFileZone(path, doc->fileName());
396395
return path;
397396
}
398397

client/MainWindow.cpp

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -445,14 +445,14 @@ void MainWindow::convertToCDoc()
445445

446446
void MainWindow::moveCryptoContainer()
447447
{
448-
QString to = selectFile(tr("Move file"), cryptoDoc->fileName(), true);
448+
QString to = FileDialog::getSaveFileName(this, tr("Move file"), cryptoDoc->fileName());
449449
if(!to.isNull() && cryptoDoc->move(to))
450450
emit ui->cryptoContainerPage->moved(to);
451451
}
452452

453453
void MainWindow::moveSignatureContainer()
454454
{
455-
QString to = selectFile(tr("Move file"), digiDoc->fileName(), true);
455+
QString to = FileDialog::getSaveFileName(this, tr("Move file"), digiDoc->fileName());
456456
if(!to.isNull() && digiDoc->move(to))
457457
emit ui->signContainerPage->moved(to);
458458
}
@@ -488,15 +488,15 @@ void MainWindow::onCryptoAction(int action, const QString &/*id*/, const QString
488488
{
489489
if(!cryptoDoc)
490490
break;
491-
QString target = selectFile(tr("Save file"), cryptoDoc->fileName(), true);
491+
QString target = FileDialog::getSaveFileName(this, tr("Save file"), cryptoDoc->fileName());
492492
if(target.isEmpty())
493493
break;
494494
if( !FileDialog::fileIsWritable(target))
495495
{
496496
auto *dlg = new WarningDialog(tr("Cannot alter container %1. Save different location?").arg(target), this);
497497
dlg->addButton(WarningDialog::YES, QMessageBox::Yes);
498498
if(dlg->exec() == QMessageBox::Yes) {
499-
QString file = selectFile(tr("Save file"), target, true);
499+
QString file = FileDialog::getSaveFileName(this, tr("Save file"), target);
500500
if(!file.isEmpty())
501501
cryptoDoc->saveCopy(file);
502502
}
@@ -612,7 +612,7 @@ void MainWindow::openFiles(const QStringList &files, bool addFile, bool forceCre
612612

613613
void MainWindow::openContainer(bool signature)
614614
{
615-
QString filter = QFileDialog::tr("All Files (*)") + QStringLiteral(";;") + tr("Documents (%1)");
615+
QString filter = QFileDialog::tr("All Files (*)") + QStringLiteral(";;") + FileDialog::tr("Documents (%1)");
616616
if(signature)
617617
filter = filter.arg(QStringLiteral("*.bdoc *.ddoc *.asice *.sce *.asics *.scs *.edoc *.adoc%1")
618618
.arg(Application::confValue(Application::SiVaUrl).toString().isEmpty() ? QLatin1String() : QLatin1String(" *.pdf")));
@@ -670,7 +670,7 @@ bool MainWindow::save(bool saveAs)
670670

671671
QString target = digiDoc->fileName();
672672
if(saveAs)
673-
target = selectFile(tr("Save file"), target, true);
673+
target = FileDialog::getSaveFileName(this, tr("Save file"), target);
674674
if(target.isEmpty())
675675
return false;
676676

@@ -679,47 +679,13 @@ bool MainWindow::save(bool saveAs)
679679
auto *dlg = new WarningDialog(tr("Cannot alter container %1. Save different location?").arg(target), this);
680680
dlg->addButton(WarningDialog::YES, QMessageBox::Yes);
681681
if(dlg->exec() == QMessageBox::Yes) {
682-
if(QString file = selectFile(tr("Save file"), target, true); !file.isEmpty())
682+
if(QString file = FileDialog::getSaveFileName(this, tr("Save file"), target); !file.isEmpty())
683683
return saveAs ? digiDoc->saveAs(file) : digiDoc->save(file);
684684
}
685685
}
686686
return saveAs ? digiDoc->saveAs(target) : digiDoc->save(target);
687687
}
688688

689-
QString MainWindow::selectFile( const QString &title, const QString &filename, bool fixedExt )
690-
{
691-
static const QString adoc = tr("Documents (%1)").arg(QLatin1String("*.adoc"));
692-
static const QString bdoc = tr("Documents (%1)").arg(QLatin1String("*.bdoc"));
693-
static const QString cdoc = tr("Documents (%1)").arg(QLatin1String("*.cdoc"));
694-
static const QString cdoc2 = tr("Documents (%1)").arg(QLatin1String("*.cdoc2"));
695-
static const QString edoc = tr("Documents (%1)").arg(QLatin1String("*.edoc"));
696-
static const QString asic = tr("Documents (%1)").arg(QLatin1String("*.asice *.sce"));
697-
const QString ext = QFileInfo( filename ).suffix().toLower();
698-
QStringList exts;
699-
QString active;
700-
if( fixedExt )
701-
{
702-
if(ext == QLatin1String("bdoc")) exts.append(bdoc);
703-
if(ext == QLatin1String("cdoc")) exts.append(cdoc);
704-
if(ext == QLatin1String("cdoc2")) exts.append(cdoc2);
705-
if(ext == QLatin1String("asice") || ext == QLatin1String("sce")) exts.append(asic);
706-
if(ext == QLatin1String("edoc")) exts.append(edoc);
707-
if(ext == QLatin1String("adoc")) exts.append(adoc);
708-
}
709-
else
710-
{
711-
exts = QStringList{ bdoc, asic, edoc, adoc };
712-
if(ext == QLatin1String("bdoc")) active = bdoc;
713-
if(ext == QLatin1String("cdoc")) active = cdoc;
714-
if(ext == QLatin1String("cdoc2")) active = cdoc2;
715-
if(ext == QLatin1String("asice") || ext == QLatin1String("sce")) active = asic;
716-
if(ext == QLatin1String("edoc")) active = edoc;
717-
if(ext == QLatin1String("adoc")) active = adoc;
718-
}
719-
720-
return FileDialog::getSaveFileName( this, title, filename, exts.join(QLatin1String(";;")), &active );
721-
}
722-
723689
void MainWindow::selectPage(Pages page)
724690
{
725691
auto *btn = page < CryptoIntro ? ui->signature : (page == MyEid ? ui->myEid : ui->crypto);

client/MainWindow.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ class MainWindow final : public QWidget
8080
void removeSignature(int index);
8181
void removeSignatureFile(int index);
8282
bool save(bool saveAs = false);
83-
QString selectFile( const QString &title, const QString &filename, bool fixedExt );
8483
template <typename F>
8584
void sign(F &&sign);
8685
bool validateFiles(const QString &container, const QStringList &files);

client/dialogs/FileDialog.cpp

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ class CPtr
4747
inline operator T*() const { return d; }
4848
inline T** operator&() { return &d; }
4949
};
50+
#elif defined(Q_OS_MAC)
51+
#include <sys/xattr.h>
5052
#endif
5153

5254
#include <array>
@@ -61,7 +63,7 @@ QString FileDialog::createNewFileName(const QString &file, bool signature, QWidg
6163
const QFileInfo f(normalized(file));
6264
QString dir = defaultDir.isEmpty() ? f.absolutePath() : defaultDir;
6365
QString fileName = QDir::toNativeSeparators(dir + QDir::separator() + f.completeBaseName() + extension);
64-
#ifndef Q_OS_OSX
66+
#ifndef Q_OS_MACOS
6567
// macOS App Sandbox restricts the rights of the application to write to the filesystem outside of
6668
// app sandbox; user must explicitly give permission to write data to the specific folders.
6769
if(!QFile::exists(fileName))
@@ -107,23 +109,6 @@ bool FileDialog::fileIsWritable( const QString &filename )
107109
return result;
108110
}
109111

110-
int FileDialog::fileZone(const QString &path)
111-
{
112-
#ifdef Q_OS_WIN
113-
CPtr<IZoneIdentifier> spzi;
114-
CPtr<IPersistFile> spf;
115-
DWORD dwZone = 0;
116-
if(SUCCEEDED(CoCreateInstance(CLSID_PersistentZoneIdentifier, nullptr, CLSCTX_INPROC, IID_PPV_ARGS(&spzi))) &&
117-
SUCCEEDED(spzi->QueryInterface(&spf)) &&
118-
SUCCEEDED(spf->Load(LPCWSTR(QDir::toNativeSeparators(path).utf16()), STGM_READ)) &&
119-
SUCCEEDED(spzi->GetId(&dwZone)))
120-
return int(dwZone);
121-
#else
122-
Q_UNUSED(path)
123-
#endif
124-
return -1;
125-
}
126-
127112
bool FileDialog::isSignedPDF(const QString &path)
128113
{
129114
if(!path.endsWith(QLatin1String("pdf"), Qt::CaseInsensitive))
@@ -136,25 +121,33 @@ bool FileDialog::isSignedPDF(const QString &path)
136121
return std::any_of(list.begin(), list.end(), [&blob](const char *token) { return blob.indexOf(token) > 0; });
137122
}
138123

139-
void FileDialog::setFileZone(const QString &path, int zone)
124+
void FileDialog::setFileZone(const QString &target, const QString &source)
140125
{
141-
if(zone < 0)
142-
return;
143126
#ifdef Q_OS_WIN
144127
CPtr<IZoneIdentifier> spzi;
145128
CPtr<IPersistFile> spf;
146-
if(SUCCEEDED(CoCreateInstance(CLSID_PersistentZoneIdentifier, nullptr, CLSCTX_INPROC, IID_PPV_ARGS(&spzi))) &&
147-
SUCCEEDED(spzi->SetId(zone)) &&
148-
SUCCEEDED(spzi->QueryInterface(&spf)))
149-
spf->Save(LPCWSTR(QDir::toNativeSeparators(path).utf16()), TRUE);
129+
if(SUCCEEDED(CoCreateInstance(CLSID_PersistentZoneIdentifier, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&spzi))) &&
130+
SUCCEEDED(spzi->QueryInterface(&spf)) &&
131+
SUCCEEDED(spf->Load(LPCWSTR(QDir::toNativeSeparators(source).utf16()), STGM_READ)))
132+
spf->Save(LPCWSTR(QDir::toNativeSeparators(target).utf16()), TRUE);
133+
#elif defined(Q_OS_MACOS)
134+
QByteArray p = QFile::encodeName(source);
135+
ssize_t n = getxattr(p.constData(), "com.apple.quarantine", nullptr, 0, 0, 0);
136+
if(n <= 0)
137+
return;
138+
QByteArray value(int(n), Qt::Uninitialized);
139+
n = getxattr(p.constData(), "com.apple.quarantine", value.data(), value.size(), 0, 0);
140+
if(n > 0)
141+
setxattr(QFile::encodeName(target).constData(), "com.apple.quarantine", value.constData(), size_t(n), 0, 0);
150142
#else
151-
Q_UNUSED(path)
143+
Q_UNUSED(target)
144+
Q_UNUSED(source)
152145
#endif
153146
}
154147

155148
void FileDialog::setReadOnly(const QString &path, bool readonly)
156149
{
157-
#if defined(Q_OS_WIN)
150+
#ifdef Q_OS_WIN
158151
::SetFileAttributesW(LPCWSTR(path.utf16()), readonly ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL);
159152
#else
160153
QFile::setPermissions(path, QFile::Permissions(QFile::Permission::ReadOwner)
@@ -164,7 +157,7 @@ void FileDialog::setReadOnly(const QString &path, bool readonly)
164157

165158
QString FileDialog::getDir( const QString &dir )
166159
{
167-
#ifdef Q_OS_OSX
160+
#ifdef Q_OS_MACOS
168161
Q_UNUSED(dir)
169162
QString path = QSettings().value(QStringLiteral("NSNavLastRootDirectory")).toString();
170163
path.replace('~', QDir::homePath());
@@ -266,14 +259,30 @@ QString FileDialog::getExistingDirectory( QWidget *parent, const QString &captio
266259
return result( res );
267260
}
268261

269-
QString FileDialog::getSaveFileName( QWidget *parent, const QString &caption,
270-
const QString &dir, const QString &filter, QString *selectedFilter, Options options )
262+
QString FileDialog::getSaveFileName(QWidget *parent, const QString &caption, const QString &filename, QString filter)
271263
{
264+
if(!filter.isEmpty())
265+
filter.clear();
266+
else if(filename.endsWith(QLatin1String(".adoc"), Qt::CaseInsensitive))
267+
filter = tr("Documents (%1)").arg(QLatin1String("*.adoc"));
268+
else if(filename.endsWith(QLatin1String(".asice"), Qt::CaseInsensitive) ||
269+
filename.endsWith(QLatin1String(".sce"), Qt::CaseInsensitive))
270+
filter = tr("Documents (%1)").arg(QLatin1String("*.asice *.sce"));
271+
else if(filename.endsWith(QLatin1String(".asics"), Qt::CaseInsensitive) ||
272+
filename.endsWith(QLatin1String(".scs"), Qt::CaseInsensitive))
273+
filter = tr("Documents (%1)").arg(QLatin1String("*.asics *.scs"));
274+
else if(filename.endsWith(QLatin1String(".bdoc"), Qt::CaseInsensitive))
275+
filter = tr("Documents (%1)").arg(QLatin1String("*.bdoc"));
276+
else if(filename.endsWith(QLatin1String(".cdoc"), Qt::CaseInsensitive))
277+
filter = tr("Documents (%1)").arg(QLatin1String("*.cdoc"));
278+
else if(filename.endsWith(QLatin1String(".cdoc2"), Qt::CaseInsensitive))
279+
filter = tr("Documents (%1)").arg(QLatin1String("*.cdoc2"));
280+
else if(filename.endsWith(QLatin1String(".edoc"), Qt::CaseInsensitive))
281+
filter = tr("Documents (%1)").arg(QLatin1String("*.edoc"));
272282
QString file;
273283
while( true )
274284
{
275-
file = QFileDialog::getSaveFileName(parent,
276-
caption, normalized(dir), filter, selectedFilter, options);
285+
file = QFileDialog::getSaveFileName(parent, caption, normalized(filename), filter);
277286
if( !file.isEmpty() && !fileIsWritable( file ) )
278287
{
279288
WarningDialog::show(parent, tr( "You don't have sufficient privileges to write this file into folder %1" ).arg( file ));
@@ -301,7 +310,7 @@ QString FileDialog::normalized(const QString &data)
301310

302311
QString FileDialog::result( const QString &str )
303312
{
304-
#ifndef Q_OS_OSX
313+
#ifndef Q_OS_MACOS
305314
if(!str.isEmpty())
306315
Settings::LAST_PATH = QFileInfo(str).absolutePath();
307316
#else
@@ -322,7 +331,7 @@ QString FileDialog::tempPath(const QString &file)
322331
{
323332
QDir tmp = QDir::temp();
324333
if(!tmp.exists(file))
325-
return tmp.path() + "/" + file;
334+
return tmp.path() + '/' + file;
326335
QFileInfo info(file);
327336
int i = 0;
328337
while(tmp.exists(QStringLiteral("%1_%2.%3").arg(info.baseName()).arg(i).arg(info.suffix())))
@@ -334,7 +343,7 @@ QString FileDialog::safeName(const QString &file)
334343
{
335344
QFileInfo info(file);
336345
QString filename = info.fileName();
337-
#if defined(Q_OS_WIN)
346+
#ifdef Q_OS_WIN
338347
static const QStringList disabled { "CON", "PRN", "AUX", "NUL",
339348
"COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9",
340349
"LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9" };

client/dialogs/FileDialog.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,8 @@ class FileDialog : public QFileDialog
3636
static QString createNewFileName(const QString &file, bool signature, QWidget *parent);
3737
static FileType detect(const QString &filename);
3838
static bool fileIsWritable( const QString &filename );
39-
static int fileZone(const QString &path);
4039
static bool isSignedPDF(const QString &path);
41-
static void setFileZone(const QString &path, int zone);
40+
static void setFileZone(const QString &target, const QString &source);
4241
static void setReadOnly(const QString &path, bool readonly = true);
4342
static QString normalized(const QString &file);
4443
static QString safeName(const QString &file);
@@ -53,8 +52,7 @@ class FileDialog : public QFileDialog
5352
static QString getExistingDirectory(QWidget *parent = nullptr, const QString &caption = {},
5453
const QString &dir = {}, Options options = {});
5554
static QString getSaveFileName(QWidget *parent = nullptr, const QString &caption = {},
56-
const QString &dir = {}, const QString &filter = {},
57-
QString *selectedFilter = nullptr, Options options = {});
55+
const QString &filename = {}, QString filter = {});
5856

5957
private:
6058
static QString result( const QString &str );

client/translations/en.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,10 @@
836836
<source>Create %1</source>
837837
<translation>Create %1</translation>
838838
</message>
839+
<message>
840+
<source>Documents (%1)</source>
841+
<translation>Documents (%1)</translation>
842+
</message>
839843
</context>
840844
<context>
841845
<name>FileItem</name>
@@ -1341,10 +1345,6 @@ ID-Card</translation>
13411345
<source>Cannot alter container %1. Save different location?</source>
13421346
<translation>Cannot alter container %1. Save to different location?</translation>
13431347
</message>
1344-
<message>
1345-
<source>Documents (%1)</source>
1346-
<translation>Documents (%1)</translation>
1347-
</message>
13481348
<message>
13491349
<source>Save file</source>
13501350
<translation>Save file</translation>

client/translations/et.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,10 @@
836836
<source>Create %1</source>
837837
<translation>Loo %1</translation>
838838
</message>
839+
<message>
840+
<source>Documents (%1)</source>
841+
<translation>Dokumendid (%1)</translation>
842+
</message>
839843
</context>
840844
<context>
841845
<name>FileItem</name>
@@ -1341,10 +1345,6 @@ ID-kaardiga</translation>
13411345
<source>Cannot alter container %1. Save different location?</source>
13421346
<translation>Ümbriku %1 salvestamine ebaõnnestus. Salvestada teise asukohta?</translation>
13431347
</message>
1344-
<message>
1345-
<source>Documents (%1)</source>
1346-
<translation>Dokumendid (%1)</translation>
1347-
</message>
13481348
<message>
13491349
<source>Save file</source>
13501350
<translation>Salvesta fail</translation>

client/translations/ru.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,10 @@
836836
<source>Create %1</source>
837837
<translation>Создайте %1</translation>
838838
</message>
839+
<message>
840+
<source>Documents (%1)</source>
841+
<translation>Документы (%1)</translation>
842+
</message>
839843
</context>
840844
<context>
841845
<name>FileItem</name>
@@ -1341,10 +1345,6 @@ ID-картой</translation>
13411345
<source>Cannot alter container %1. Save different location?</source>
13421346
<translation>Сохранение контейнера %1 не удалось. Сохранить в другой каталог?</translation>
13431347
</message>
1344-
<message>
1345-
<source>Documents (%1)</source>
1346-
<translation>Документы (%1)</translation>
1347-
</message>
13481348
<message>
13491349
<source>Save file</source>
13501350
<translation>Сохранить файл</translation>

0 commit comments

Comments
 (0)