|
|
|
@ -20,13 +20,10 @@
|
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
#include <sys/stat.h>
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
|
|
#include <tqfile.h>
|
|
|
|
|
#include <tqtextstream.h>
|
|
|
|
|
|
|
|
|
|
#include "PowerService.h"
|
|
|
|
|
|
|
|
|
@ -42,7 +39,7 @@ PowerService::~PowerService()
|
|
|
|
|
// TODO Auto-generated destructor stub
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool PowerService::canSetHibernation(TQString disk, TQString state, TQT_DBusError& error) {
|
|
|
|
|
bool PowerService::canSetHibernation(TQString state, TQT_DBusError& error) {
|
|
|
|
|
|
|
|
|
|
// check if path is writable
|
|
|
|
|
bool state_writable = false;
|
|
|
|
@ -50,6 +47,7 @@ bool PowerService::canSetHibernation(TQString disk, TQString state, TQT_DBusErro
|
|
|
|
|
if (rval == 0) {
|
|
|
|
|
state_writable = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool disk_writable = false;
|
|
|
|
|
rval = access ("/sys/power/disk", W_OK);
|
|
|
|
|
if (rval == 0) {
|
|
|
|
@ -59,33 +57,35 @@ bool PowerService::canSetHibernation(TQString disk, TQString state, TQT_DBusErro
|
|
|
|
|
// check if method is supported
|
|
|
|
|
bool method1 = false, method2 = false;
|
|
|
|
|
if (state_writable && disk_writable) {
|
|
|
|
|
FILE *statenode = fopen("/sys/power/state", "r");
|
|
|
|
|
if (statenode != NULL) {
|
|
|
|
|
char *line = NULL;
|
|
|
|
|
size_t len = 0;
|
|
|
|
|
ssize_t read = getline(&line, &len, statenode);
|
|
|
|
|
if (read > 0 && line) {
|
|
|
|
|
method1 = (strstr(line, state.latin1()) != NULL);
|
|
|
|
|
free(line);
|
|
|
|
|
}
|
|
|
|
|
if (fclose(statenode) == EOF) {
|
|
|
|
|
// Error!
|
|
|
|
|
error = TQT_DBusError::stdInvalidArgs(TQString ("Could not flush stream for method " + method1));
|
|
|
|
|
|
|
|
|
|
TQFile file( "/sys/power/state" );
|
|
|
|
|
if ( file.open( IO_ReadOnly ) ) {
|
|
|
|
|
TQTextStream stream( &file );
|
|
|
|
|
TQString line;
|
|
|
|
|
while ( !stream.atEnd() ) {
|
|
|
|
|
line = stream.readLine(); // line of text excluding '\n'
|
|
|
|
|
if ( line.find(state, 0) >= 0)
|
|
|
|
|
method1 = true;
|
|
|
|
|
}
|
|
|
|
|
file.close();
|
|
|
|
|
} else {
|
|
|
|
|
error = TQT_DBusError::stdInvalidArgs(TQString ("Could not open /sys/power/state"));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
FILE *disknode = fopen("/sys/power/disk", "r");
|
|
|
|
|
if (disknode != NULL) {
|
|
|
|
|
char *line = NULL;
|
|
|
|
|
size_t len = 0;
|
|
|
|
|
ssize_t read = getline(&line, &len, disknode);
|
|
|
|
|
if (read > 0 && line) {
|
|
|
|
|
method2 = (strstr(line, disk.latin1()) != NULL);
|
|
|
|
|
free(line);
|
|
|
|
|
}
|
|
|
|
|
if (fclose(disknode) == EOF) {
|
|
|
|
|
// Error!
|
|
|
|
|
error = TQT_DBusError::stdInvalidArgs(TQString ("Could not flush stream for method " + method2));
|
|
|
|
|
|
|
|
|
|
TQFile file1("/sys/power/disk");
|
|
|
|
|
if ( file1.open( IO_ReadOnly ) ) {
|
|
|
|
|
TQTextStream stream( &file );
|
|
|
|
|
TQString line;
|
|
|
|
|
while ( !stream.atEnd() ) {
|
|
|
|
|
line = stream.readLine(); // line of text excluding '\n'
|
|
|
|
|
if ( line.find(state, 0) >= 0)
|
|
|
|
|
method2 = true;
|
|
|
|
|
}
|
|
|
|
|
file1.close();
|
|
|
|
|
} else {
|
|
|
|
|
error = TQT_DBusError::stdInvalidArgs(TQString ("Could not open /sys/power/disk"));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -93,47 +93,33 @@ bool PowerService::canSetHibernation(TQString disk, TQString state, TQT_DBusErro
|
|
|
|
|
return state_writable && disk_writable && method1 && method2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool PowerService::setHibernation(TQString disk, TQString state, TQT_DBusError& error) {
|
|
|
|
|
bool PowerService::setHibernation(TQString state, TQT_DBusError& error) {
|
|
|
|
|
// set hibernation state
|
|
|
|
|
|
|
|
|
|
bool written1 = false, written2 = false;
|
|
|
|
|
|
|
|
|
|
// check if path is writable
|
|
|
|
|
int state_writable = false;
|
|
|
|
|
int rval = access ("/sys/power/state", W_OK);
|
|
|
|
|
if (rval == 0) {
|
|
|
|
|
state_writable = true;
|
|
|
|
|
}
|
|
|
|
|
int disk_writable = false;
|
|
|
|
|
rval = access ("/sys/power/disk", W_OK);
|
|
|
|
|
if (rval == 0) {
|
|
|
|
|
disk_writable = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (state_writable && disk_writable) {
|
|
|
|
|
FILE *disknode = fopen("/sys/power/disk", "w");
|
|
|
|
|
if (disknode != NULL) {
|
|
|
|
|
if (fputs(disk.latin1(), disknode) != EOF) {
|
|
|
|
|
written1 = true;
|
|
|
|
|
}
|
|
|
|
|
if (fclose(disknode) == EOF) {
|
|
|
|
|
// Error!
|
|
|
|
|
error = TQT_DBusError::stdInvalidArgs(TQString ("Could not flush stream for method " + disk));
|
|
|
|
|
}
|
|
|
|
|
if (canSetHibernation(state,error)) {
|
|
|
|
|
TQFile file("/sys/power/disk");
|
|
|
|
|
if (!file.open( IO_WriteOnly ) ) {
|
|
|
|
|
error = TQT_DBusError::stdFailed(TQString ("Could not open device /sys/power/disk"));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (written1)
|
|
|
|
|
{
|
|
|
|
|
FILE *statenode = fopen("/sys/power/state", "w");
|
|
|
|
|
if (statenode != NULL) {
|
|
|
|
|
if (fputs(state.latin1(), statenode) != EOF) {
|
|
|
|
|
written2 = true;
|
|
|
|
|
}
|
|
|
|
|
if (fclose(statenode) == EOF) {
|
|
|
|
|
// Error!
|
|
|
|
|
error = TQT_DBusError::stdInvalidArgs(TQString ("Could not flush stream for method " + state));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
TQTextStream stream( &file );
|
|
|
|
|
stream << state;
|
|
|
|
|
file.close();
|
|
|
|
|
written1 = true;
|
|
|
|
|
|
|
|
|
|
file.setName("/sys/power/state");
|
|
|
|
|
if (!file.open( IO_WriteOnly ) ) {
|
|
|
|
|
error = TQT_DBusError::stdFailed(TQString ("Could not open device /sys/power/state"));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
TQTextStream stream1( &file );
|
|
|
|
|
stream1 << state;
|
|
|
|
|
file.close();
|
|
|
|
|
written2 = true;
|
|
|
|
|
} else {
|
|
|
|
|
error = TQT_DBusError::stdFailed(TQString ("Could not set state: " + state));
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return written1 && written2;
|
|
|
|
@ -166,7 +152,7 @@ bool PowerService::Standby(bool& value, TQT_DBusError& error) {
|
|
|
|
|
|
|
|
|
|
bool PowerService::CanFreeze(bool& value, TQT_DBusError& error) {
|
|
|
|
|
// do something
|
|
|
|
|
value = canSetDeviceValue("/sys/power/state", error) && canSetDeviceValue("/sys/power/disk", error);
|
|
|
|
|
value = canSetDeviceValue("/sys/power/state", error);
|
|
|
|
|
if (error.isValid()) {
|
|
|
|
|
tqDebug(error.message().local8Bit().data());
|
|
|
|
|
return false;
|
|
|
|
@ -176,7 +162,7 @@ bool PowerService::CanFreeze(bool& value, TQT_DBusError& error) {
|
|
|
|
|
|
|
|
|
|
bool PowerService::Freeze(bool& value, TQT_DBusError& error) {
|
|
|
|
|
// do something
|
|
|
|
|
value = setDeviceValue("/sys/power/disk", "freeze", error);
|
|
|
|
|
value = setDeviceValue("/sys/power/state", "freeze", error);
|
|
|
|
|
if (error.isValid()) {
|
|
|
|
|
tqDebug(error.message().local8Bit().data());
|
|
|
|
|
return false;
|
|
|
|
@ -186,8 +172,12 @@ bool PowerService::Freeze(bool& value, TQT_DBusError& error) {
|
|
|
|
|
|
|
|
|
|
bool PowerService::CanSuspend(bool& value, TQT_DBusError& error) {
|
|
|
|
|
// do something
|
|
|
|
|
value = canSetDeviceValue("/sys/power/state", error) && canSetDeviceValue("/sys/power/disk", error);
|
|
|
|
|
return (error.isValid()) ? false : true;
|
|
|
|
|
value = canSetDeviceValue("/sys/power/state", error);
|
|
|
|
|
if (error.isValid()) {
|
|
|
|
|
tqDebug(error.message().local8Bit().data());
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool PowerService::Suspend(bool& value, TQT_DBusError& error) {
|
|
|
|
@ -202,7 +192,7 @@ bool PowerService::Suspend(bool& value, TQT_DBusError& error) {
|
|
|
|
|
|
|
|
|
|
bool PowerService::CanHibernate(bool& value, TQT_DBusError& error) {
|
|
|
|
|
// do something
|
|
|
|
|
value = canSetHibernation(TQString("/sys/power/disk"), "platform", error);
|
|
|
|
|
value = canSetHibernation("platform", error);
|
|
|
|
|
if (error.isValid()) {
|
|
|
|
|
tqDebug(error.message().local8Bit().data());
|
|
|
|
|
return false;
|
|
|
|
@ -212,7 +202,7 @@ bool PowerService::CanHibernate(bool& value, TQT_DBusError& error) {
|
|
|
|
|
|
|
|
|
|
bool PowerService::Hibernate(bool& value, TQT_DBusError& error) {
|
|
|
|
|
// do something
|
|
|
|
|
value = setHibernation("/sys/power/disk", "platform", error);
|
|
|
|
|
value = setHibernation("platform", error);
|
|
|
|
|
if (error.isValid()) {
|
|
|
|
|
tqDebug(error.message().local8Bit().data());
|
|
|
|
|
return false;
|
|
|
|
@ -222,7 +212,7 @@ bool PowerService::Hibernate(bool& value, TQT_DBusError& error) {
|
|
|
|
|
|
|
|
|
|
bool PowerService::CanHybridSuspend(bool& value, TQT_DBusError& error) {
|
|
|
|
|
// do something
|
|
|
|
|
value = canSetHibernation("/sys/power/disk", "suspend", error);
|
|
|
|
|
value = canSetHibernation("suspend", error);
|
|
|
|
|
if (error.isValid()) {
|
|
|
|
|
tqDebug(error.message().local8Bit().data());
|
|
|
|
|
return false;
|
|
|
|
@ -232,7 +222,7 @@ bool PowerService::CanHybridSuspend(bool& value, TQT_DBusError& error) {
|
|
|
|
|
|
|
|
|
|
bool PowerService::HybridSuspend(bool& value, TQT_DBusError& error) {
|
|
|
|
|
// do something
|
|
|
|
|
value = setHibernation("/sys/power/disk", "suspend", error);
|
|
|
|
|
value = setHibernation("suspend", error);
|
|
|
|
|
if (error.isValid()) {
|
|
|
|
|
tqDebug(error.message().local8Bit().data());
|
|
|
|
|
return false;
|
|
|
|
@ -257,6 +247,7 @@ bool PowerService::SetHibernationMethod(const TQString& method, bool& value, TQT
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
//TODO may be set dbus error
|
|
|
|
|
value = false;
|
|
|
|
|
error = TQT_DBusError::stdInvalidArgs(TQString ("Invalid argument for method: " + method));
|
|
|
|
|
}
|
|
|
|
|
if (error.isValid()) {
|
|
|
|
|