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 8 years ago
parent a29712773b
commit 92394e2850

@ -3325,6 +3325,10 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice* exist
if (dirlist) {
TQFileInfoListIterator valuesdirit(*dirlist);
TQFileInfo *dirfi;
TDESystemPowerStateList powerstates;
TDESystemHibernationMethodList hibernationmethods;
TDESystemHibernationMethod::TDESystemHibernationMethod hibernationmethod =
TDESystemHibernationMethod::Unsupported;
while ( (dirfi = valuesdirit.current()) != 0 ) {
nodename = dirfi->fileName();
TQFile file( valuesnodename + nodename );
@ -3333,7 +3337,6 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice* exist
TQString line;
line = stream.readLine();
if (nodename == "state") {
TDESystemPowerStateList powerstates;
// Always assume that these two fully on/fully off states are available
powerstates.append(TDESystemPowerState::Active);
powerstates.append(TDESystemPowerState::PowerOff);
@ -3347,13 +3350,11 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice* exist
powerstates.append(TDESystemPowerState::Suspend);
}
if (line.contains("disk")) {
powerstates.append(TDESystemPowerState::Hibernate);
powerstates.append(TDESystemPowerState::Disk);
}
rdevice->internalSetPowerStates(powerstates);
}
if (nodename == "disk") {
// Get list of available hibernation methods
TDESystemHibernationMethodList hibernationmethods;
if (line.contains("platform")) {
hibernationmethods.append(TDESystemHibernationMethod::Platform);
}
@ -3372,12 +3373,10 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice* exist
if (line.contains("test")) {
hibernationmethods.append(TDESystemHibernationMethod::Test);
}
rdevice->internalSetHibernationMethods(hibernationmethods);
// Get current hibernation method
line.truncate(line.findRev("]"));
line.remove(0, line.findRev("[")+1);
TDESystemHibernationMethod::TDESystemHibernationMethod hibernationmethod = TDESystemHibernationMethod::Unsupported;
if (line.contains("platform")) {
hibernationmethod = TDESystemHibernationMethod::Platform;
}
@ -3396,7 +3395,6 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice* exist
if (line.contains("test")) {
hibernationmethod = TDESystemHibernationMethod::Test;
}
rdevice->internalSetHibernationMethod(hibernationmethod);
}
if (nodename == "image_size") {
rdevice->internalSetDiskSpaceNeededForHibernation(line.toULong());
@ -3405,6 +3403,22 @@ void TDEHardwareDevices::updateExistingDeviceInformation(TDEGenericDevice* exist
}
++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 disk_rval = access (disknode.ascii(), W_OK);
if (state_rval == 0 && disk_rval == 0) {
if (powerStates().contains(TDESystemPowerState::Hibernate) &&
hibernationMethods().contains(TDESystemHibernationMethod::Platform)) {
if (powerStates().contains(TDESystemPowerState::Hibernate)) {
return TRUE;
}
else {
@ -416,8 +415,7 @@ bool TDERootSystemDevice::canHybridSuspend() {
int state_rval = access (statenode.ascii(), W_OK);
int disk_rval = access (disknode.ascii(), W_OK);
if (state_rval == 0 && disk_rval == 0) {
if (powerStates().contains(TDESystemPowerState::Hibernate) &&
hibernationMethods().contains(TDESystemHibernationMethod::Suspend)) {
if (powerStates().contains(TDESystemPowerState::HybridSuspend)) {
return TRUE;
}
else {

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

Loading…
Cancel
Save