Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Weixuan Xiao
kdeconnect-kde
Commits
0f18b9c7
Commit
0f18b9c7
authored
Jan 21, 2014
by
Samoilenko Yuri
Browse files
blocking mount
parent
bbca88ef
Changes
5
Hide whitespace changes
Inline
Side-by-side
kded/plugins/sftp/CMakeLists.txt
View file @
0f18b9c7
...
...
@@ -13,6 +13,7 @@ include_directories(
set
(
kdeconnect_sftp_SRCS
sftpplugin.cpp
mountloop.cpp
../kdeconnectplugin.cpp
../pluginloader.cpp
../../networkpackage.cpp
...
...
@@ -41,6 +42,7 @@ include(../../../macros.cmake)
generate_and_install_dbus_interface
(
kdeconnect_sftp
sftpplugin.h
mountloop.h
org.kde.kdeconnect.device.sftp.xml
OPTIONS -a
)
...
...
kded/plugins/sftp/mountloop.cpp
0 → 100644
View file @
0f18b9c7
/**
* Copyright 2013 Albert Vaca <albertvaka@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "mountloop.h"
MountLoop
::
MountLoop
()
:
QEventLoop
()
{}
bool
MountLoop
::
exec
(
QEventLoop
::
ProcessEventsFlags
flags
)
{
return
QEventLoop
::
exec
(
flags
)
==
0
;
}
void
MountLoop
::
failed
()
{
Q_EMIT
(
result
(
false
));
exit
(
1
);
}
void
MountLoop
::
successed
()
{
Q_EMIT
(
result
(
true
));
exit
(
0
);
}
void
MountLoop
::
exitWith
(
bool
status
)
{
Q_EMIT
(
result
(
status
));
exit
(
status
?
0
:
1
);
}
kded/plugins/sftp/mountloop.h
0 → 100644
View file @
0f18b9c7
/**
* Copyright 2013 Albert Vaca <albertvaka@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SFTPPLUGIN_MOUNTLOOP_H
#define SFTPPLUGIN_MOUNTLOOP_H
#include <QEventLoop>
class
MountLoop
:
public
QEventLoop
{
Q_OBJECT
public:
MountLoop
();
bool
exec
(
QEventLoop
::
ProcessEventsFlags
flags
=
QEventLoop
::
AllEvents
);
Q_SIGNALS:
void
result
(
bool
status
);
public
Q_SLOTS
:
void
failed
();
void
successed
();
void
exitWith
(
bool
status
);
};
#endif
kded/plugins/sftp/sftpplugin.cpp
View file @
0f18b9c7
...
...
@@ -37,55 +37,41 @@
#include <kfileplacesmodel.h>
#include "sftp_config.h"
#include "mountloop.h"
#include "../../kdebugnamespace.h"
K_PLUGIN_FACTORY
(
KdeConnectPluginFactory
,
registerPlugin
<
SftpPlugin
>
();
)
K_EXPORT_PLUGIN
(
KdeConnectPluginFactory
(
"kdeconnect_sftp"
,
"kdeconnect_sftp"
)
)
static
const
char
*
timestamp_c
=
"timestamp
"
;
static
const
char
*
lastaccess_c
=
"lastaccess
"
;
static
const
QSet
<
QString
>
fields_c
=
QSet
<
QString
>
()
<<
"ip"
<<
"port"
<<
"user"
<<
"port"
<<
"path"
;
inline
bool
isTimeout
(
QObject
*
o
,
const
KConfigGroup
&
cfg
)
{
if
(
!
o
)
return
false
;
int
duration
=
o
->
property
(
timestamp
_c
).
toDateTime
().
secsTo
(
QDateTime
::
currentDateTime
());
int
duration
=
o
->
property
(
lastaccess
_c
).
toDateTime
().
secsTo
(
QDateTime
::
currentDateTime
());
return
cfg
.
readEntry
(
"idle"
,
true
)
&&
duration
>
(
cfg
.
readEntry
(
"idletimeout"
,
60
)
*
60
);
}
MountLoop
::
MountLoop
()
:
QEventLoop
()
{
}
bool
MountLoop
::
exec
(
QEventLoop
::
ProcessEventsFlags
flags
)
{
return
QEventLoop
::
exec
(
flags
)
==
0
;
}
void
MountLoop
::
failed
()
{
Q_EMIT
(
result
(
false
));
exit
(
1
);
}
void
MountLoop
::
successed
()
{
Q_EMIT
(
result
(
true
));
exit
(
0
);
}
void
MountLoop
::
exitWith
(
bool
status
)
{
Q_EMIT
(
result
(
status
));
exit
(
status
?
0
:
1
);
}
struct
SftpPlugin
::
Pimpl
{
Pimpl
()
{
connectTimer
.
setInterval
(
10
*
1000
);
connectTimer
.
setSingleShot
(
true
);
//Add KIO entry to Dolphin's Places
placesModel
=
new
KFilePlacesModel
();
}
QPointer
<
KProcess
>
mountProc
;
KFilePlacesModel
*
m_placesModel
;
int
idleTimer
;
KFilePlacesModel
*
placesModel
;
QTimer
connectTimer
;
int
idleTimerId
;
MountLoop
loop
;
};
...
...
@@ -95,13 +81,16 @@ SftpPlugin::SftpPlugin(QObject *parent, const QVariantList &args)
{
kDebug
(
kdeconnect_kded
())
<<
"creating ["
<<
device
()
->
name
()
<<
"]..."
;
m_d
->
idleTimer
=
startTimer
(
20
*
1000
);
m_d
->
idleTimerId
=
startTimer
(
20
*
1000
);
connect
(
&
m_d
->
connectTimer
,
SIGNAL
(
timeout
()),
this
,
SLOT
(
mountTimeout
()));
connect
(
&
m_d
->
connectTimer
,
SIGNAL
(
timeout
()),
&
m_d
->
loop
,
SLOT
(
failed
()));
connect
(
this
,
SIGNAL
(
mount_succesed
()),
&
m_d
->
loop
,
SLOT
(
successed
()));
connect
(
this
,
SIGNAL
(
mount_failed
()),
&
m_d
->
loop
,
SLOT
(
failed
()));
//Add KIO entry to Dolphin's Places
m_d
->
m_placesModel
=
new
KFilePlacesModel
();
addToDolphin
();
kDebug
(
kdeconnect_kded
())
<<
"created ["
<<
device
()
->
name
()
<<
"]"
;
}
...
...
@@ -120,17 +109,17 @@ void SftpPlugin::addToDolphin()
{
removeFromDolphin
();
KUrl
kioUrl
(
"kdeconnect://"
+
device
()
->
id
()
+
"/"
);
m_d
->
m_
placesModel
->
addPlace
(
device
()
->
name
(),
kioUrl
,
"smartphone"
);
m_d
->
placesModel
->
addPlace
(
device
()
->
name
(),
kioUrl
,
"smartphone"
);
kDebug
(
kdeconnect_kded
())
<<
"add to dolphin"
;
}
void
SftpPlugin
::
removeFromDolphin
()
{
KUrl
kioUrl
(
"kdeconnect://"
+
device
()
->
id
()
+
"/"
);
QModelIndex
index
=
m_d
->
m_
placesModel
->
closestItem
(
kioUrl
);
QModelIndex
index
=
m_d
->
placesModel
->
closestItem
(
kioUrl
);
while
(
index
.
row
()
!=
-
1
)
{
m_d
->
m_
placesModel
->
removePlace
(
index
);
index
=
m_d
->
m_
placesModel
->
closestItem
(
kioUrl
);
m_d
->
placesModel
->
removePlace
(
index
);
index
=
m_d
->
placesModel
->
closestItem
(
kioUrl
);
}
}
...
...
@@ -148,6 +137,8 @@ void SftpPlugin::mount()
return
;
}
m_d
->
connectTimer
.
start
();
NetworkPackage
np
(
PACKAGE_TYPE_SFTP
);
np
.
set
(
"startBrowsing"
,
true
);
device
()
->
sendPackage
(
np
);
...
...
@@ -164,20 +155,18 @@ bool SftpPlugin::mountAndWait()
if
(
m_d
->
loop
.
isRunning
())
{
kDebug
(
kdeconnect_kded
())
<<
"start secondary loop"
;
MountLoop
loop
;
connect
(
&
m_d
->
loop
,
SIGNAL
(
result
(
bool
)),
&
loop
,
SLOT
(
exitWith
(
bool
)));
return
loop
.
exec
();
}
kDebug
(
kdeconnect_kded
())
<<
"call mounting"
<<
device
()
->
name
();
mount
();
QTimer
mt
;
connect
(
&
mt
,
SIGNAL
(
timeout
()),
&
m_d
->
loop
,
SLOT
(
failed
()));
connect
(
&
mt
,
SIGNAL
(
timeout
()),
this
,
SLOT
(
mountTimeout
()));
kDebug
(
kdeconnect_kded
())
<<
"stargting timer"
;
mt
.
start
(
15000
);
kDebug
(
kdeconnect_kded
())
<<
"start primary loop"
;
return
m_d
->
loop
.
exec
();
}
...
...
@@ -217,8 +206,10 @@ bool SftpPlugin::receivePackage(const NetworkPackage& np)
return
true
;
}
m_d
->
connectTimer
.
stop
();
m_d
->
mountProc
=
new
KProcess
(
this
);
m_d
->
mountProc
->
setOutputChannelMode
(
KProcess
::
Separate
Channels
);
m_d
->
mountProc
->
setOutputChannelMode
(
KProcess
::
Merged
Channels
);
connect
(
m_d
->
mountProc
,
SIGNAL
(
started
()),
SLOT
(
onStarted
()));
connect
(
m_d
->
mountProc
,
SIGNAL
(
error
(
QProcess
::
ProcessError
)),
SLOT
(
onError
(
QProcess
::
ProcessError
)));
...
...
@@ -257,7 +248,7 @@ QString SftpPlugin::mountPoint()
void
SftpPlugin
::
timerEvent
(
QTimerEvent
*
event
)
{
if
(
event
->
timerId
()
==
m_d
->
idleTimer
)
if
(
event
->
timerId
()
==
m_d
->
idleTimer
Id
)
{
if
(
isTimeout
(
m_d
->
mountProc
,
SftpConfig
::
config
()
->
group
(
"main"
)))
{
...
...
@@ -270,9 +261,9 @@ void SftpPlugin::timerEvent(QTimerEvent* event)
void
SftpPlugin
::
onStarted
()
{
kDebug
(
kdeconnect_kded
())
<<
qobject_cast
<
KProcess
*>
(
sender
())
->
program
();
kDebug
(
kdeconnect_kded
())
<<
qobject_cast
<
KProcess
*>
(
sender
())
->
program
()
.
join
(
" "
)
;
m_d
->
mountProc
->
setProperty
(
timestamp
_c
,
QDateTime
::
currentDateTime
());
m_d
->
mountProc
->
setProperty
(
lastaccess
_c
,
QDateTime
::
currentDateTime
());
knotify
(
KNotification
::
Notification
,
i18n
(
"Filesystem mounted at %1"
).
arg
(
mountPoint
())
...
...
@@ -282,8 +273,8 @@ void SftpPlugin::onStarted()
//Used to notify MountLoop about success.
Q_EMIT
mount_succesed
();
connect
(
m_d
->
mountProc
,
SIGNAL
(
readyReadStandardError
()),
this
,
SLOT
(
readProcess
Stderr
()));
connect
(
m_d
->
mountProc
,
SIGNAL
(
readyReadStandardOutput
()),
this
,
SLOT
(
readProcess
Stdo
ut
()));
connect
(
m_d
->
mountProc
,
SIGNAL
(
readyReadStandardError
()),
this
,
SLOT
(
readProcess
Out
()));
connect
(
m_d
->
mountProc
,
SIGNAL
(
readyReadStandardOutput
()),
this
,
SLOT
(
readProcess
O
ut
()));
}
void
SftpPlugin
::
onError
(
QProcess
::
ProcessError
error
)
...
...
@@ -360,16 +351,10 @@ void SftpPlugin::mountTimeout()
);
}
void
SftpPlugin
::
readProcessStderr
()
{
m_d
->
mountProc
->
setProperty
(
timestamp_c
,
QDateTime
::
currentDateTime
());
m_d
->
mountProc
->
readAllStandardError
();
}
void
SftpPlugin
::
readProcessStdout
()
void
SftpPlugin
::
readProcessOut
()
{
m_d
->
mountProc
->
setProperty
(
timestamp
_c
,
QDateTime
::
currentDateTime
());
m_d
->
mountProc
->
readAll
StandardOutput
();
m_d
->
mountProc
->
setProperty
(
lastaccess
_c
,
QDateTime
::
currentDateTime
());
m_d
->
mountProc
->
readAll
();
}
bool
SftpPlugin
::
waitForMount
()
...
...
kded/plugins/sftp/sftpplugin.h
View file @
0f18b9c7
...
...
@@ -30,24 +30,6 @@
class
KNotification
;
//TODO move to private
class
MountLoop
:
public
QEventLoop
{
Q_OBJECT
public:
MountLoop
();
bool
exec
(
QEventLoop
::
ProcessEventsFlags
flags
=
QEventLoop
::
AllEvents
);
Q_SIGNALS:
void
result
(
bool
status
);
public
Q_SLOTS
:
void
failed
();
void
successed
();
void
exitWith
(
bool
status
);
};
class
SftpPlugin
:
public
KdeConnectPlugin
{
...
...
@@ -92,8 +74,7 @@ private Q_SLOTS:
void
onFinished
(
int
exitCode
,
QProcess
::
ExitStatus
exitStatus
);
void
mountTimeout
();
void
readProcessStderr
();
void
readProcessStdout
();
void
readProcessOut
();
bool
waitForMount
();
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment