Skip to content

Commit 209f3c8

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

File tree

9 files changed

+67
-99
lines changed

9 files changed

+67
-99
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: 42 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
#include "FileDialog.h"
2121

22-
#include "Application.h"
2322
#include "Settings.h"
2423
#include "dialogs/WarningDialog.h"
2524

@@ -47,6 +46,8 @@ class CPtr
4746
inline operator T*() const { return d; }
4847
inline T** operator&() { return &d; }
4948
};
49+
#elif defined(Q_OS_MAC)
50+
#include <sys/xattr.h>
5051
#endif
5152

5253
#include <array>
@@ -61,7 +62,7 @@ QString FileDialog::createNewFileName(const QString &file, bool signature, QWidg
6162
const QFileInfo f(normalized(file));
6263
QString dir = defaultDir.isEmpty() ? f.absolutePath() : defaultDir;
6364
QString fileName = QDir::toNativeSeparators(dir + QDir::separator() + f.completeBaseName() + extension);
64-
#ifndef Q_OS_OSX
65+
#ifndef Q_OS_MACOS
6566
// macOS App Sandbox restricts the rights of the application to write to the filesystem outside of
6667
// app sandbox; user must explicitly give permission to write data to the specific folders.
6768
if(!QFile::exists(fileName))
@@ -107,23 +108,6 @@ bool FileDialog::fileIsWritable( const QString &filename )
107108
return result;
108109
}
109110

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-
127111
bool FileDialog::isSignedPDF(const QString &path)
128112
{
129113
if(!path.endsWith(QLatin1String("pdf"), Qt::CaseInsensitive))
@@ -136,25 +120,33 @@ bool FileDialog::isSignedPDF(const QString &path)
136120
return std::any_of(list.begin(), list.end(), [&blob](const char *token) { return blob.indexOf(token) > 0; });
137121
}
138122

139-
void FileDialog::setFileZone(const QString &path, int zone)
123+
void FileDialog::setFileZone(const QString &target, const QString &source)
140124
{
141-
if(zone < 0)
142-
return;
143125
#ifdef Q_OS_WIN
144126
CPtr<IZoneIdentifier> spzi;
145127
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);
128+
if(SUCCEEDED(CoCreateInstance(CLSID_PersistentZoneIdentifier, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&spzi))) &&
129+
SUCCEEDED(spzi->QueryInterface(&spf)) &&
130+
SUCCEEDED(spf->Load(LPCWSTR(QDir::toNativeSeparators(source).utf16()), STGM_READ)))
131+
spf->Save(LPCWSTR(QDir::toNativeSeparators(target).utf16()), TRUE);
132+
#elif defined(Q_OS_MACOS)
133+
QByteArray p = QFile::encodeName(source);
134+
ssize_t n = getxattr(p.constData(), "com.apple.quarantine", nullptr, 0, 0, 0);
135+
if(n <= 0)
136+
return;
137+
QByteArray value(int(n), Qt::Uninitialized);
138+
n = getxattr(p.constData(), "com.apple.quarantine", value.data(), value.size(), 0, 0);
139+
if(n > 0)
140+
setxattr(QFile::encodeName(target).constData(), "com.apple.quarantine", value.constData(), size_t(n), 0, 0);
150141
#else
151-
Q_UNUSED(path)
142+
Q_UNUSED(target)
143+
Q_UNUSED(source)
152144
#endif
153145
}
154146

155147
void FileDialog::setReadOnly(const QString &path, bool readonly)
156148
{
157-
#if defined(Q_OS_WIN)
149+
#ifdef Q_OS_WIN
158150
::SetFileAttributesW(LPCWSTR(path.utf16()), readonly ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL);
159151
#else
160152
QFile::setPermissions(path, QFile::Permissions(QFile::Permission::ReadOwner)
@@ -164,7 +156,7 @@ void FileDialog::setReadOnly(const QString &path, bool readonly)
164156

165157
QString FileDialog::getDir( const QString &dir )
166158
{
167-
#ifdef Q_OS_OSX
159+
#ifdef Q_OS_MACOS
168160
Q_UNUSED(dir)
169161
QString path = QSettings().value(QStringLiteral("NSNavLastRootDirectory")).toString();
170162
path.replace('~', QDir::homePath());
@@ -266,14 +258,28 @@ QString FileDialog::getExistingDirectory( QWidget *parent, const QString &captio
266258
return result( res );
267259
}
268260

269-
QString FileDialog::getSaveFileName( QWidget *parent, const QString &caption,
270-
const QString &dir, const QString &filter, QString *selectedFilter, Options options )
261+
QString FileDialog::getSaveFileName(QWidget *parent, const QString &caption, const QString &filename, QString filter)
271262
{
263+
if(filename.endsWith(QLatin1String(".adoc"), Qt::CaseInsensitive))
264+
filter = tr("Documents (%1)").arg(QLatin1String("*.adoc"));
265+
else if(filename.endsWith(QLatin1String(".asice"), Qt::CaseInsensitive) ||
266+
filename.endsWith(QLatin1String(".sce"), Qt::CaseInsensitive))
267+
filter = tr("Documents (%1)").arg(QLatin1String("*.asice *.sce"));
268+
else if(filename.endsWith(QLatin1String(".asics"), Qt::CaseInsensitive) ||
269+
filename.endsWith(QLatin1String(".scs"), Qt::CaseInsensitive))
270+
filter = tr("Documents (%1)").arg(QLatin1String("*.asics *.scs"));
271+
else if(filename.endsWith(QLatin1String(".bdoc"), Qt::CaseInsensitive))
272+
filter = tr("Documents (%1)").arg(QLatin1String("*.bdoc"));
273+
else if(filename.endsWith(QLatin1String(".cdoc"), Qt::CaseInsensitive))
274+
filter = tr("Documents (%1)").arg(QLatin1String("*.cdoc"));
275+
else if(filename.endsWith(QLatin1String(".cdoc2"), Qt::CaseInsensitive))
276+
filter = tr("Documents (%1)").arg(QLatin1String("*.cdoc2"));
277+
else if(filename.endsWith(QLatin1String(".edoc"), Qt::CaseInsensitive))
278+
filter = tr("Documents (%1)").arg(QLatin1String("*.edoc"));
272279
QString file;
273280
while( true )
274281
{
275-
file = QFileDialog::getSaveFileName(parent,
276-
caption, normalized(dir), filter, selectedFilter, options);
282+
file = QFileDialog::getSaveFileName(parent, caption, normalized(filename), filter);
277283
if( !file.isEmpty() && !fileIsWritable( file ) )
278284
{
279285
WarningDialog::show(parent, tr( "You don't have sufficient privileges to write this file into folder %1" ).arg( file ));
@@ -301,7 +307,7 @@ QString FileDialog::normalized(const QString &data)
301307

302308
QString FileDialog::result( const QString &str )
303309
{
304-
#ifndef Q_OS_OSX
310+
#ifndef Q_OS_MACOS
305311
if(!str.isEmpty())
306312
Settings::LAST_PATH = QFileInfo(str).absolutePath();
307313
#else
@@ -322,7 +328,7 @@ QString FileDialog::tempPath(const QString &file)
322328
{
323329
QDir tmp = QDir::temp();
324330
if(!tmp.exists(file))
325-
return tmp.path() + "/" + file;
331+
return tmp.path() + '/' + file;
326332
QFileInfo info(file);
327333
int i = 0;
328334
while(tmp.exists(QStringLiteral("%1_%2.%3").arg(info.baseName()).arg(i).arg(info.suffix())))
@@ -334,7 +340,7 @@ QString FileDialog::safeName(const QString &file)
334340
{
335341
QFileInfo info(file);
336342
QString filename = info.fileName();
337-
#if defined(Q_OS_WIN)
343+
#ifdef Q_OS_WIN
338344
static const QStringList disabled { "CON", "PRN", "AUX", "NUL",
339345
"COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9",
340346
"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)