Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
I
imager
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
NML
imager
Commits
497e527b
Commit
497e527b
authored
4 years ago
by
mingf2
Browse files
Options
Downloads
Patches
Plain Diff
add permission check
parent
3ea013cb
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
Sources/MainWindow.cpp
+148
-25
148 additions, 25 deletions
Sources/MainWindow.cpp
Sources/setup.cpp
+1
-1
1 addition, 1 deletion
Sources/setup.cpp
imagerQt.pro
+3
-3
3 additions, 3 deletions
imagerQt.pro
with
152 additions
and
29 deletions
Sources/MainWindow.cpp
+
148
−
25
View file @
497e527b
...
@@ -20,7 +20,7 @@
...
@@ -20,7 +20,7 @@
#include
<QMessageBox>
#include
<QMessageBox>
#include
<QDoubleValidator>
#include
<QDoubleValidator>
#include
<QIntValidator>
#include
<QIntValidator>
#include
<Q
SignalMappe
r>
#include
<Q
RegExpValidato
r>
MainWindow
::
MainWindow
(
QWidget
*
parent
)
:
MainWindow
::
MainWindow
(
QWidget
*
parent
)
:
QMainWindow
(
parent
),
QMainWindow
(
parent
),
...
@@ -44,6 +44,7 @@ MainWindow::MainWindow(QWidget *parent) :
...
@@ -44,6 +44,7 @@ MainWindow::MainWindow(QWidget *parent) :
// quit worker thread and clear plot data immediately when any settings are changed
// quit worker thread and clear plot data immediately when any settings are changed
connect
(
ui
->
openProject
,
&
QPushButton
::
clicked
,
this
,
&
MainWindow
::
handleOpenProj
);
connect
(
ui
->
openProject
,
&
QPushButton
::
clicked
,
this
,
&
MainWindow
::
handleOpenProj
);
connect
(
ui
->
openFileButton
,
&
QPushButton
::
clicked
,
this
,
&
MainWindow
::
onOpenFileClicked
);
connect
(
ui
->
openFileButton
,
&
QPushButton
::
clicked
,
this
,
&
MainWindow
::
onOpenFileClicked
);
ui
->
runIDInput
->
setValidator
(
new
QRegExpValidator
(
QRegExp
(
"[A-Za-z0-9_]+"
),
ui
->
runIDInput
));
connect
(
ui
->
runIDInput
,
&
QLineEdit
::
editingFinished
,
this
,
&
MainWindow
::
onRunIDInput
);
connect
(
ui
->
runIDInput
,
&
QLineEdit
::
editingFinished
,
this
,
&
MainWindow
::
onRunIDInput
);
ui
->
maxEventNumInput
->
setValidator
(
new
QIntValidator
(
1
,
10000000
,
ui
->
maxEventNumInput
));
ui
->
maxEventNumInput
->
setValidator
(
new
QIntValidator
(
1
,
10000000
,
ui
->
maxEventNumInput
));
connect
(
ui
->
maxEventNumInput
,
&
QLineEdit
::
editingFinished
,
this
,
&
MainWindow
::
onMaxEventNumInput
);
connect
(
ui
->
maxEventNumInput
,
&
QLineEdit
::
editingFinished
,
this
,
&
MainWindow
::
onMaxEventNumInput
);
...
@@ -137,9 +138,12 @@ MainWindow::MainWindow(QWidget *parent) :
...
@@ -137,9 +138,12 @@ MainWindow::MainWindow(QWidget *parent) :
// connect(ui->applySettingsButton, &QPushButton::clicked, this, &MainWindow::onConfigApplied);
// connect(ui->applySettingsButton, &QPushButton::clicked, this, &MainWindow::onConfigApplied);
setWindowTitle
(
tr
(
"Back projection"
));
setWindowTitle
(
tr
(
"Back projection"
));
while
(
!
handleOpenProj
())
qDebug
()
<<
"Attempting to open a project"
;
if
(
!
handleOpenProj
())
{
{
qDebug
()
<<
"Attempting to open a project"
;
qDebug
()
<<
"Cannot open project. Exit application."
;
// QCoreApplication::exit(1);
exit
(
EXIT_FAILURE
);
}
}
ui
->
statusBar
->
showMessage
(
"Ready."
);
ui
->
statusBar
->
showMessage
(
"Ready."
);
}
}
...
@@ -216,7 +220,8 @@ bool MainWindow::handleOpenProj()
...
@@ -216,7 +220,8 @@ bool MainWindow::handleOpenProj()
if
(
config
)
if
(
config
)
{
{
// save current settings
// save current settings
config
->
writeSetup
(
config
->
outputDir
.
currentPath
()
+
"settings.ini"
);
config
->
writeSetup
(
"settings.ini"
);
// stop current run
onConfigChanged
();
onConfigChanged
();
}
}
// select project dir
// select project dir
...
@@ -224,37 +229,126 @@ bool MainWindow::handleOpenProj()
...
@@ -224,37 +229,126 @@ bool MainWindow::handleOpenProj()
dialog
.
setWindowTitle
(
"Open a new or existing project"
);
dialog
.
setWindowTitle
(
"Open a new or existing project"
);
dialog
.
setFileMode
(
QFileDialog
::
DirectoryOnly
);
dialog
.
setFileMode
(
QFileDialog
::
DirectoryOnly
);
dialog
.
setOption
(
QFileDialog
::
ShowDirsOnly
,
false
);
dialog
.
setOption
(
QFileDialog
::
ShowDirsOnly
,
false
);
if
(
dialog
.
exec
())
if
(
!
dialog
.
exec
())
return
false
;
QFileInfo
proj_dir
(
dialog
.
directory
().
absolutePath
());
if
(
!
proj_dir
.
isDir
())
{
QMessageBox
::
critical
(
this
,
"Failed to open direcory"
,
QString
(
"%1 is not a directory."
).
arg
(
proj_dir
.
absolutePath
()));
return
false
;
}
if
(
!
proj_dir
.
isWritable
())
{
{
QDir
::
setCurrent
(
dialog
.
directory
().
path
());
QMessageBox
::
critical
(
this
,
"Permission denied"
,
QString
(
"%1 is not writable."
).
arg
(
proj_dir
.
absolutePath
()));
return
false
;
}
// qDebug() << QDir::current();
// qDebug() << QDir::current();
// if settings.ini does not exist, copy the template settings.ini file to current dir
// if settings.ini does not exist, copy the template settings.ini file to current dir
if
(
!
QDir
::
current
().
exists
(
"settings.ini"
))
QString
settingsPath
=
dialog
.
directory
().
absolutePath
()
+
"/settings.ini"
;
{
if
(
!
dialog
.
directory
().
exists
(
"settings.ini"
))
QFile
::
copy
(
":/Data/Data/settings.ini"
,
"settings.ini"
);
{
}
if
(
!
QFile
::
copy
(
":/Data/Data/settings.ini"
,
settingsPath
)){
// read .ini file in current dir
QMessageBox
::
critical
(
this
,
"Cannot create file"
,
QString
(
"Cannot create settings.ini in %1"
).
arg
(
proj_dir
.
absolutePath
()));
if
(
!
config
)
// start up
return
false
;
config
=
new
Setup
(
"settings.ini"
);
else
{
config
->
readSetup
(
"settings.ini"
);
}
}
showConfig
();
return
true
;
}
}
return
false
;
// check read permission
if
(
!
QFileInfo
(
settingsPath
).
isReadable
()
&&
!
QFile
::
setPermissions
(
settingsPath
,
QFileDevice
::
ReadOwner
))
{
QMessageBox
::
critical
(
this
,
"Permission denied"
,
QString
(
"Cannot read settings.ini in %1"
).
arg
(
proj_dir
.
absolutePath
()));
return
false
;
}
// check write permission
if
(
!
QFileInfo
(
settingsPath
).
isWritable
()
&&
!
QFile
::
setPermissions
(
settingsPath
,
QFileDevice
::
WriteOwner
))
{
QMessageBox
::
critical
(
this
,
"Permission denied"
,
QString
(
"Cannot write to settings.ini in %1"
).
arg
(
proj_dir
.
absolutePath
()));
return
false
;
}
// set current path to this dir
QDir
::
setCurrent
(
dialog
.
directory
().
absolutePath
());
// read .ini file in current dir
if
(
!
config
)
// start up
config
=
new
Setup
(
"settings.ini"
);
else
{
config
->
readSetup
(
"settings.ini"
);
}
showConfig
();
return
true
;
}
}
bool
MainWindow
::
handleSave
()
bool
MainWindow
::
handleSave
()
{
{
qDebug
()
<<
"Save clicked"
;
qDebug
()
<<
"Save clicked"
;
return
true
;
if
(
config
){
config
->
writeSetup
(
"settings.ini"
);
ui
->
statusBar
->
showMessage
(
"Project settings saved."
);
return
true
;
}
return
false
;
}
}
bool
MainWindow
::
handleSaveAs
()
bool
MainWindow
::
handleSaveAs
()
{
{
qDebug
()
<<
"Save as clicked"
;
qDebug
()
<<
"Save as clicked"
;
if
(
!
config
)
return
false
;
// save current settings
config
->
writeSetup
(
"settings.ini"
);
// stop current run
onConfigChanged
();
// select new dir
QFileDialog
dialog
;
dialog
.
setWindowTitle
(
"Save as"
);
dialog
.
setFileMode
(
QFileDialog
::
DirectoryOnly
);
dialog
.
setOption
(
QFileDialog
::
ShowDirsOnly
,
false
);
if
(
!
dialog
.
exec
())
return
false
;
QFileInfo
proj_dir
(
dialog
.
directory
().
absolutePath
());
if
(
!
proj_dir
.
isDir
())
{
QMessageBox
::
critical
(
this
,
"Failed to open direcory"
,
QString
(
"%1 is not a directory."
).
arg
(
proj_dir
.
absolutePath
()));
return
false
;
}
if
(
!
proj_dir
.
isWritable
())
{
QMessageBox
::
critical
(
this
,
"Permission denied"
,
QString
(
"%1 is not writable."
).
arg
(
proj_dir
.
absolutePath
()));
return
false
;
}
// qDebug() << QDir::current();
// if settings.ini does not exist, copy the template settings.ini file to current dir
QString
settingsPath
=
dialog
.
directory
().
absolutePath
()
+
"/settings.ini"
;
if
(
!
dialog
.
directory
().
exists
(
"settings.ini"
))
{
if
(
!
QFile
::
copy
(
"settings.ini"
,
settingsPath
)){
QMessageBox
::
critical
(
this
,
"Cannot create file"
,
QString
(
"Cannot create settings.ini in %1"
).
arg
(
proj_dir
.
absolutePath
()));
return
false
;
}
}
// check read permission
if
(
!
QFileInfo
(
settingsPath
).
isReadable
()
&&
!
QFile
::
setPermissions
(
settingsPath
,
QFileDevice
::
ReadOwner
))
{
QMessageBox
::
critical
(
this
,
"Permission denied"
,
QString
(
"Cannot read settings.ini in %1"
).
arg
(
proj_dir
.
absolutePath
()));
return
false
;
}
// check write permission
if
(
!
QFileInfo
(
settingsPath
).
isWritable
()
&&
!
QFile
::
setPermissions
(
settingsPath
,
QFileDevice
::
WriteOwner
))
{
QMessageBox
::
critical
(
this
,
"Permission denied"
,
QString
(
"Cannot write to settings.ini in %1"
).
arg
(
proj_dir
.
absolutePath
()));
return
false
;
}
// set current path to this dir
QDir
::
setCurrent
(
dialog
.
directory
().
absolutePath
());
// read .ini file in current dir
config
->
readSetup
(
"settings.ini"
);
showConfig
();
ui
->
statusBar
->
showMessage
(
QString
(
"Project saved to %1"
).
arg
(
QDir
::
currentPath
()));
return
true
;
return
true
;
}
}
...
@@ -273,6 +367,7 @@ void MainWindow::handleAbout()
...
@@ -273,6 +367,7 @@ void MainWindow::handleAbout()
void
MainWindow
::
notifyThreadFinished
()
void
MainWindow
::
notifyThreadFinished
()
{
{
ui
->
statusBar
->
showMessage
(
"Stopped"
);
// pop up a message box indicating processing is finished.
// pop up a message box indicating processing is finished.
// if (!aborted)
// if (!aborted)
// {
// {
...
@@ -293,11 +388,11 @@ void MainWindow::handleStart()
...
@@ -293,11 +388,11 @@ void MainWindow::handleStart()
if
(
!
workerThread
.
isNull
())
if
(
!
workerThread
.
isNull
())
{
{
emit
workerStarted
();
emit
workerStarted
();
ui
->
statusBar
->
showMessage
(
"Running"
);
}
}
else
{
else
{
onConfigApplied
();
onConfigApplied
();
}
}
ui
->
statusBar
->
showMessage
(
"Running"
);
}
}
void
MainWindow
::
handlePause
()
void
MainWindow
::
handlePause
()
...
@@ -364,8 +459,19 @@ void MainWindow::showConfig()
...
@@ -364,8 +459,19 @@ void MainWindow::showConfig()
bool
MainWindow
::
checkConfig
()
bool
MainWindow
::
checkConfig
()
{
{
// check if file exists
if
(
!
QFile
(
config
->
filePath
).
exists
()){
QMessageBox
::
critical
(
this
,
"File not exist"
,
QString
(
"Cannot open file %1"
).
arg
(
config
->
filePath
));
return
false
;
}
// check if runID already exists
if
(
config
->
outputDir
.
exists
())
{
if
(
config
->
outputDir
.
exists
())
{
// check if runID already exists
// check if it's writable
if
(
!
QFileInfo
(
config
->
outputDir
.
absolutePath
()).
isWritable
())
{
QMessageBox
::
critical
(
this
,
"Permission denied"
,
QString
(
"Cannot write to directory %1"
).
arg
(
config
->
outputDir
.
absolutePath
()));
return
false
;
}
QMessageBox
::
StandardButton
resBtn
=
QMessageBox
::
question
(
this
,
"Overwrite"
,
QMessageBox
::
StandardButton
resBtn
=
QMessageBox
::
question
(
this
,
"Overwrite"
,
QString
(
"Run-%1 already exists. Are you sure you want to overwrite?
\n
"
).
arg
(
config
->
runID
),
QString
(
"Run-%1 already exists. Are you sure you want to overwrite?
\n
"
).
arg
(
config
->
runID
),
QMessageBox
::
Cancel
|
QMessageBox
::
No
|
QMessageBox
::
Yes
,
QMessageBox
::
Cancel
|
QMessageBox
::
No
|
QMessageBox
::
Yes
,
...
@@ -375,8 +481,24 @@ bool MainWindow::checkConfig()
...
@@ -375,8 +481,24 @@ bool MainWindow::checkConfig()
}
}
}
}
else
{
else
{
// create a new dir
// create a new dir for current ID
config
->
outputDir
.
mkpath
(
"."
);
if
(
!
config
->
outputDir
.
mkpath
(
"."
)){
QMessageBox
::
critical
(
this
,
"Permission denied"
,
"Cannot create output directory for run "
+
config
->
runID
);
return
false
;
}
// check read permission
QString
outdirpath
=
config
->
outputDir
.
absolutePath
();
if
(
!
QFileInfo
(
outdirpath
).
isReadable
()
&&
!
QFile
::
setPermissions
(
outdirpath
,
QFileDevice
::
ReadOwner
))
{
QMessageBox
::
critical
(
this
,
"Permission denied"
,
QString
(
"Cannot read settings.ini in %1"
).
arg
(
outdirpath
));
return
false
;
}
// check write permission
if
(
!
QFileInfo
(
outdirpath
).
isWritable
()
&&
!
QFile
::
setPermissions
(
outdirpath
,
QFileDevice
::
WriteOwner
))
{
QMessageBox
::
critical
(
this
,
"Permission denied"
,
QString
(
"Cannot write to settings.ini in %1"
).
arg
(
outdirpath
));
return
false
;
}
}
}
if
(
config
->
phiMax
<=
config
->
phiMin
)
if
(
config
->
phiMax
<=
config
->
phiMin
)
...
@@ -405,7 +527,8 @@ bool MainWindow::checkConfig()
...
@@ -405,7 +527,8 @@ bool MainWindow::checkConfig()
for
(
int
i
=
0
;
i
<
config
->
channelSettings
.
size
();
i
++
)
{
for
(
int
i
=
0
;
i
<
config
->
channelSettings
.
size
();
i
++
)
{
for
(
int
j
=
i
+
1
;
j
<
config
->
channelSettings
.
size
();
j
++
)
{
for
(
int
j
=
i
+
1
;
j
<
config
->
channelSettings
.
size
();
j
++
)
{
if
(
config
->
channelSettings
[
j
].
chNum
==
config
->
channelSettings
[
i
].
chNum
){
if
(
config
->
channelSettings
[
j
].
chNum
==
config
->
channelSettings
[
i
].
chNum
){
QMessageBox
::
warning
(
this
,
"Duplicated channel number."
,
QString
(
"Channel-%1 and channel-%2 have same channel number."
).
arg
(
QString
::
number
(
i
+
1
),
QString
::
number
(
j
+
1
)));
QMessageBox
::
warning
(
this
,
"Duplicated channel number."
,
QString
(
"Channel-%1 and channel-%2 have same channel number."
).
arg
(
QString
::
number
(
i
+
1
),
QString
::
number
(
j
+
1
)));
return
false
;
return
false
;
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
Sources/setup.cpp
+
1
−
1
View file @
497e527b
...
@@ -14,7 +14,7 @@ void Setup::readSetup(const QString path)
...
@@ -14,7 +14,7 @@ void Setup::readSetup(const QString path)
// filePath = ":/Data/Data/pulses.txt";
// filePath = ":/Data/Data/pulses.txt";
// filePath = "/media/ming/DATA/projects/Postprocessing/simulation_2/pulses_with_pos_sort_by_time.txt";
// filePath = "/media/ming/DATA/projects/Postprocessing/simulation_2/pulses_with_pos_sort_by_time.txt";
// filePath = "/media/ming/DATA/projects/Postprocessing/simulation_3/pulses_with_pos_sort_by_time.txt";
// filePath = "/media/ming/DATA/projects/Postprocessing/simulation_3/pulses_with_pos_sort_by_time.txt";
filePath
=
"/home/mingf2/Downloads/pulses_with_pos_sort_by_time.txt"
;
//
filePath = "/home/mingf2/Downloads/pulses_with_pos_sort_by_time.txt";
runID
=
settings
.
value
(
"RunID"
).
toString
();
runID
=
settings
.
value
(
"RunID"
).
toString
();
outputDir
=
QDir
(
runID
);
outputDir
=
QDir
(
runID
);
maxN
=
settings
.
value
(
"MaxEventNum"
).
toInt
();
maxN
=
settings
.
value
(
"MaxEventNum"
).
toInt
();
...
...
This diff is collapsed.
Click to expand it.
imagerQt.pro
+
3
−
3
View file @
497e527b
...
@@ -57,14 +57,14 @@ QMAKE_CXXFLAGS += -fopenmp
...
@@ -57,14 +57,14 @@ QMAKE_CXXFLAGS += -fopenmp
#
QMAKE_LFLAGS
+=
-
fsanitize
=
address
#
QMAKE_LFLAGS
+=
-
fsanitize
=
address
LIBS
+=
-
fopenmp
LIBS
+=
-
fopenmp
#
ROOTSYS
=/
home
/
ming
/
root
ROOTSYS
=/
home
/
ming
/
root
INCLUDEPATH
+=
\
INCLUDEPATH
+=
\
$$
(
ROOTSYS
)
/
include
\
$$
ROOTSYS
/
include
\
$$
PWD
/
Headers
$$
PWD
/
Headers
LIBS
+=
\
LIBS
+=
\
-
L
$$
(
ROOTSYS
)
/
lib
-
lCore
-
lImt
-
lRIO
-
lNet
-
lHist
-
lGraf
\
-
L
$$
ROOTSYS
/
lib
-
lCore
-
lImt
-
lRIO
-
lNet
-
lHist
-
lGraf
\
-
lGraf3d
-
lGpad
-
lTree
-
lTreePlayer
-
lRint
-
lPostscript
-
lMatrix
\
-
lGraf3d
-
lGpad
-
lTree
-
lTreePlayer
-
lRint
-
lPostscript
-
lMatrix
\
-
lPhysics
-
lMathCore
-
lThread
-
lMultiProc
-
pthread
-
lm
-
ldl
-
rdynamic
-
lPhysics
-
lMathCore
-
lThread
-
lMultiProc
-
pthread
-
lm
-
ldl
-
rdynamic
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment