tdecore: Improved code for hybrid suspend (aka suspend to RAM + suspend to disk).

Now code is more consistent. This relates to bug 2601.

Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
pull/1/head
Michele Calgaro 9 years ago
parent a29712773b
commit 92394e2850

@ -3325,6 +3325,10 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice* exist
if (dirlist) { if (dirlist) {
TQFileInfoListIterator valuesdirit(*dirlist); TQFileInfoListIterator valuesdirit(*dirlist);
TQFileInfo *dirfi; TQFileInfo *dirfi;
TDESystemPowerStateList powerstates;
TDESystemHibernationMethodList hibernationmethods;
TDESystemHibernationMethod::TDESystemHibernationMethod hibernationmethod =
TDESystemHibernationMethod::Unsupported;
while ( (dirfi = valuesdirit.current()) != 0 ) { while ( (dirfi = valuesdirit.current()) != 0 ) {
nodename = dirfi->fileName(); nodename = dirfi->fileName();
TQFile file( valuesnodename + nodename ); TQFile file( valuesnodename + nodename );
@ -3333,7 +3337,6 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice* exist
TQString line; TQString line;
line = stream.readLine(); line = stream.readLine();
if (nodename == "state") { if (nodename == "state") {
TDESystemPowerStateList powerstates;
// Always assume that these two fully on/fully off states are available // Always assume that these two fully on/fully off states are available
powerstates.append(TDESystemPowerState::Active); powerstates.append(TDESystemPowerState::Active);
powerstates.append(TDESystemPowerState::PowerOff); powerstates.append(TDESystemPowerState::PowerOff);
@ -3347,13 +3350,11 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice* exist
powerstates.append(TDESystemPowerState::Suspend); powerstates.append(TDESystemPowerState::Suspend);
} }
if (line.contains("disk")) { if (line.contains("disk")) {
powerstates.append(TDESystemPowerState::Hibernate); powerstates.append(TDESystemPowerState::Disk);
} }
rdevice->internalSetPowerStates(powerstates);
} }
if (nodename == "disk") { if (nodename == "disk") {
// Get list of available hibernation methods // Get list of available hibernation methods
TDESystemHibernationMethodList hibernationmethods;
if (line.contains("platform")) { if (line.contains("platform")) {
hibernationmethods.append(TDESystemHibernationMethod::Platform); hibernationmethods.append(TDESystemHibernationMethod::Platform);
} }
@ -3372,12 +3373,10 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice* exist
if (line.contains("test")) { if (line.contains("test")) {
hibernationmethods.append(TDESystemHibernationMethod::Test); hibernationmethods.append(TDESystemHibernationMethod::Test);
} }
rdevice->internalSetHibernationMethods(hibernationmethods);
// Get current hibernation method // Get current hibernation method
line.truncate(line.findRev("]")); line.truncate(line.findRev("]"));
line.remove(0, line.findRev("[")+1); line.remove(0, line.findRev("[")+1);
TDESystemHibernationMethod::TDESystemHibernationMethod hibernationmethod = TDESystemHibernationMethod::Unsupported;
if (line.contains("platform")) { if (line.contains("platform")) {
hibernationmethod = TDESystemHibernationMethod::Platform; hibernationmethod = TDESystemHibernationMethod::Platform;
} }
@ -3396,7 +3395,6 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice* exist
if (line.contains("test")) { if (line.contains("test")) {
hibernationmethod = TDESystemHibernationMethod::Test; hibernationmethod = TDESystemHibernationMethod::Test;
} }
rdevice->internalSetHibernationMethod(hibernationmethod);
} }
if (nodename == "image_size") { if (nodename == "image_size") {
rdevice->internalSetDiskSpaceNeededForHibernation(line.toULong()); rdevice->internalSetDiskSpaceNeededForHibernation(line.toULong());
@ -3405,6 +3403,22 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice* exist
} }
++valuesdirit; ++valuesdirit;
} }
// Hibernation and Hybrid Suspend are not real power states, being just two different
// ways of suspending to disk. Since they are very common and it is very convenient to
// treat them as power states, we do so, as other power frameworks also do.
if (powerstates.contains(TDESystemPowerState::Disk) &&
hibernationmethods.contains(TDESystemHibernationMethod::Platform)) {
powerstates.append(TDESystemPowerState::Hibernate);
}
if (powerstates.contains(TDESystemPowerState::Disk) &&
hibernationmethods.contains(TDESystemHibernationMethod::Suspend)) {
powerstates.append(TDESystemPowerState::HybridSuspend);
}
powerstates.remove(TDESystemPowerState::Disk);
// Set power states and hibernation methods
rdevice->internalSetPowerStates(powerstates);
rdevice->internalSetHibernationMethods(hibernationmethods);
rdevice->internalSetHibernationMethod(hibernationmethod);
} }
} }

@ -300,8 +300,7 @@ bool TDERootSystemDevice::canHibernate() {
int state_rval = access (statenode.ascii(), W_OK); int state_rval = access (statenode.ascii(), W_OK);
int disk_rval = access (disknode.ascii(), W_OK); int disk_rval = access (disknode.ascii(), W_OK);
if (state_rval == 0 && disk_rval == 0) { if (state_rval == 0 && disk_rval == 0) {
if (powerStates().contains(TDESystemPowerState::Hibernate) && if (powerStates().contains(TDESystemPowerState::Hibernate)) {
hibernationMethods().contains(TDESystemHibernationMethod::Platform)) {
return TRUE; return TRUE;
} }
else { else {
@ -416,8 +415,7 @@ bool TDERootSystemDevice::canHybridSuspend() {
int state_rval = access (statenode.ascii(), W_OK); int state_rval = access (statenode.ascii(), W_OK);
int disk_rval = access (disknode.ascii(), W_OK); int disk_rval = access (disknode.ascii(), W_OK);
if (state_rval == 0 && disk_rval == 0) { if (state_rval == 0 && disk_rval == 0) {
if (powerStates().contains(TDESystemPowerState::Hibernate) && if (powerStates().contains(TDESystemPowerState::HybridSuspend)) {
hibernationMethods().contains(TDESystemHibernationMethod::Suspend)) {
return TRUE; return TRUE;
} }
else { else {

@ -42,7 +42,8 @@ enum TDESystemPowerState {
Hibernate, Hibernate,
PowerOff, PowerOff,
Reboot, Reboot,
HybridSuspend HybridSuspend,
Disk // Used temporarily to detect hibernation and hybrid suspend capability
}; };
}; };

Loading…
Cancel
Save