summaryrefslogtreecommitdiff
path: root/libopie2/opiecore/device/odevice_zaurus.cpp
authoralwin <alwin>2005-03-21 22:35:12 (UTC)
committer alwin <alwin>2005-03-21 22:35:12 (UTC)
commit16ddf84003a9eaa5e56de00287e01d9a09fd864a (patch) (side-by-side diff)
tree54c7c512d975904ed1026026a0fb35df795cfe47 /libopie2/opiecore/device/odevice_zaurus.cpp
parentc941b705b5eac2d2d2e9f4e3e3879227c344a42c (diff)
downloadopie-16ddf84003a9eaa5e56de00287e01d9a09fd864a.zip
opie-16ddf84003a9eaa5e56de00287e01d9a09fd864a.tar.gz
opie-16ddf84003a9eaa5e56de00287e01d9a09fd864a.tar.bz2
on non-embedix kernel zaurii devices don't wait after suspend 'cause
apm there is synchronous. for that I had to move a variable from private to protected in abstractmobiledevice.
Diffstat (limited to 'libopie2/opiecore/device/odevice_zaurus.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/device/odevice_zaurus.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/libopie2/opiecore/device/odevice_zaurus.cpp b/libopie2/opiecore/device/odevice_zaurus.cpp
index 72378ff..8aefc13 100644
--- a/libopie2/opiecore/device/odevice_zaurus.cpp
+++ b/libopie2/opiecore/device/odevice_zaurus.cpp
@@ -628,3 +628,30 @@ bool Zaurus::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress,
return false;
}
+bool Zaurus::suspend() {
+ if ( !isQWS( ) ) // only qwsserver is allowed to suspend
+ return false;
+
+ bool res = false;
+ OAbstractMobileDevice::sendSuspendmsg();
+
+ struct timeval tvs, tvn;
+ ::gettimeofday ( &tvs, 0 );
+
+ ::sync(); // flush fs caches
+ res = ( ::system ( "apm --suspend" ) == 0 );
+
+ // This is needed because some apm implementations are asynchronous and we
+ // can not be sure when exactly the device is really suspended
+ // This can be deleted as soon as a stable familiar with a synchronous apm implementation exists.
+ // on non embedix eg. 2.6 kernel line apm is synchronous so we don't need it here.
+
+ if ( res && m_embedix) {
+ do { // wait at most 1.5 sec: either suspend didn't work or the device resumed
+ ::usleep ( 200 * 1000 );
+ ::gettimeofday ( &tvn, 0 );
+ } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < m_timeOut );
+ }
+
+ return res;
+}