• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdecore
 

tdecore

  • tdecore
  • tdehw
tderootsystemdevice.cpp
1 /* This file is part of the TDE libraries
2  Copyright (C) 2012 Timothy Pearson <kb9vqf@pearsoncomputing.net>
3  (C) 2013 Golubev Alexander <fatzer2@gmail.com>
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Library General Public
7  License version 2 as published by the Free Software Foundation.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Library General Public License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to
16  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  Boston, MA 02110-1301, USA.
18 */
19 
20 #include "tderootsystemdevice.h"
21 #include "tdestoragedevice.h"
22 
23 #include <unistd.h>
24 
25 #include <tqfile.h>
26 
27 #include <dcopclient.h>
28 #include "tdeglobal.h"
29 #include "tdeconfig.h"
30 #include "tdeapplication.h"
31 #include "kstandarddirs.h"
32 
33 #include "config.h"
34 
35 #if defined(WITH_TDEHWLIB_DAEMONS) || defined(WITH_UPOWER) || defined(WITH_DEVKITPOWER) || defined(WITH_CONSOLEKIT)
36  #include <tqdbusdata.h>
37  #include <tqdbusmessage.h>
38  #include <tqdbusproxy.h>
39  #include <tqdbusvariant.h>
40  #include <tqdbusconnection.h>
41 #endif
42 
43 TDERootSystemDevice::TDERootSystemDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) : TDEGenericDevice(dt, dn) {
44  m_hibernationSpace = -1;
45 }
46 
47 TDERootSystemDevice::~TDERootSystemDevice() {
48 }
49 
50 TDESystemFormFactor::TDESystemFormFactor TDERootSystemDevice::formFactor() {
51  return m_formFactor;
52 }
53 
54 void TDERootSystemDevice::internalSetFormFactor(TDESystemFormFactor::TDESystemFormFactor ff) {
55  m_formFactor = ff;
56 }
57 
58 TDESystemPowerStateList TDERootSystemDevice::powerStates() {
59  return m_powerStates;
60 }
61 
62 void TDERootSystemDevice::internalSetPowerStates(TDESystemPowerStateList ps) {
63  m_powerStates = ps;
64 }
65 
66 TDESystemHibernationMethodList TDERootSystemDevice::hibernationMethods() {
67  return m_hibernationMethods;
68 }
69 
70 void TDERootSystemDevice::internalSetHibernationMethods(TDESystemHibernationMethodList hm) {
71  m_hibernationMethods = hm;
72 }
73 
74 TDESystemHibernationMethod::TDESystemHibernationMethod TDERootSystemDevice::hibernationMethod() {
75  return m_hibernationMethod;
76 }
77 
78 void TDERootSystemDevice::internalSetHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm) {
79  m_hibernationMethod = hm;
80 }
81 
82 unsigned long TDERootSystemDevice::diskSpaceNeededForHibernation() {
83  return m_hibernationSpace;
84 }
85 
86 void TDERootSystemDevice::internalSetDiskSpaceNeededForHibernation(unsigned long sz) {
87  m_hibernationSpace = sz;
88 }
89 
90 bool TDERootSystemDevice::canSetHibernationMethod() {
91  TQString hibernationnode = "/sys/power/disk";
92  int rval = access (hibernationnode.ascii(), W_OK);
93  if (rval == 0) {
94  return true;
95  }
96 
97 #ifdef WITH_TDEHWLIB_DAEMONS
98  {
99  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
100  if (dbusConn.isConnected()) {
101  // can set hibernation method?
102  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
103  "org.trinitydesktop.hardwarecontrol",
104  "/org/trinitydesktop/hardwarecontrol",
105  "org.trinitydesktop.hardwarecontrol.Power",
106  "CanSetHibernationMethod");
107  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
108  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
109  return reply[0].toBool();
110  }
111  }
112  }
113 #endif // WITH_TDEHWLIB_DAEMONS
114 
115  return false;
116 }
117 
118 bool TDERootSystemDevice::canStandby() {
119  TQString statenode = "/sys/power/state";
120  int rval = access (statenode.ascii(), W_OK);
121  if (rval == 0) {
122  if (powerStates().contains(TDESystemPowerState::Standby)) {
123  return true;
124  }
125  else {
126  return false;
127  }
128  }
129 
130 #ifdef WITH_TDEHWLIB_DAEMONS
131  {
132  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
133  if (dbusConn.isConnected()) {
134  // can standby?
135  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
136  "org.trinitydesktop.hardwarecontrol",
137  "/org/trinitydesktop/hardwarecontrol",
138  "org.trinitydesktop.hardwarecontrol.Power",
139  "CanStandby");
140  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
141  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
142  return reply[0].toBool();
143  }
144  }
145  }
146 #endif // WITH_TDEHWLIB_DAEMONS
147 
148  return false;
149 }
150 
151 bool TDERootSystemDevice::canFreeze() {
152  int rval1 = access ("/var/lib/q4os/disable_can_freeze.stp", R_OK); //if file exists, globally disable freeze option
153  if( rval1 == 0 ) {
154  return FALSE;
155  }
156 
157  TQString statenode = "/sys/power/state";
158  int rval = access (statenode.ascii(), W_OK);
159  if (rval == 0) {
160  if (powerStates().contains(TDESystemPowerState::Freeze)) {
161  return true;
162  }
163  else {
164  return false;
165  }
166  }
167 
168 #ifdef WITH_TDEHWLIB_DAEMONS
169  {
170  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
171  if (dbusConn.isConnected()) {
172  // can freeze?
173  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
174  "org.trinitydesktop.hardwarecontrol",
175  "/org/trinitydesktop/hardwarecontrol",
176  "org.trinitydesktop.hardwarecontrol.Power",
177  "CanFreeze");
178  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
179  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
180  return reply[0].toBool();
181  }
182  }
183  }
184 #endif // WITH_TDEHWLIB_DAEMONS
185 
186  return false;
187 }
188 
189 bool TDERootSystemDevice::canSuspend() {
190  TQString statenode = "/sys/power/state";
191  int rval = access (statenode.ascii(), W_OK);
192  if (rval == 0) {
193  if (powerStates().contains(TDESystemPowerState::Suspend)) {
194  return true;
195  }
196  else {
197  return false;
198  }
199  }
200 
201 #ifdef WITH_LOGINDPOWER
202  {
203  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
204  if (dbusConn.isConnected()) {
205  // can suspend?
206  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
207  "org.freedesktop.login1",
208  "/org/freedesktop/login1",
209  "org.freedesktop.login1.Manager",
210  "CanSuspend");
211  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
212  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
213  return (reply[0].toString() == "yes");
214  }
215  }
216  }
217 #endif // WITH_LOGINDPOWER
218 
219 #ifdef WITH_UPOWER
220  {
221  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
222  if (dbusConn.isConnected()) {
223  TQT_DBusProxy upowerProperties("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", dbusConn);
224  if (upowerProperties.canSend()) {
225  // can suspend?
226  TQValueList<TQT_DBusData> params;
227  params << TQT_DBusData::fromString(upowerProperties.interface()) << TQT_DBusData::fromString("CanSuspend");
228  TQT_DBusMessage reply = upowerProperties.sendWithReply("Get", params);
229  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
230  return reply[0].toVariant().value.toBool();
231  }
232  }
233  }
234  }
235 #endif// WITH_UPOWER
236 
237 #ifdef WITH_DEVKITPOWER
238  {
239  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
240  if (dbusConn.isConnected()) {
241  TQT_DBusProxy devkitpowerProperties("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power", "org.freedesktop.DBus.Properties", dbusConn);
242  if (devkitpowerProperties.canSend()) {
243  // can suspend?
244  TQValueList<TQT_DBusData> params;
245  params << TQT_DBusData::fromString(devkitpowerProperties.interface()) << TQT_DBusData::fromString("CanSuspend");
246  TQT_DBusMessage reply = devkitpowerProperties.sendWithReply("Get", params);
247  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
248  return reply[0].toVariant().value.toBool();
249  }
250  }
251  }
252  }
253 #endif// WITH_DEVKITPOWER
254 
255 #ifdef WITH_TDEHWLIB_DAEMONS
256  {
257  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
258  if (dbusConn.isConnected()) {
259  // can suspend?
260  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
261  "org.trinitydesktop.hardwarecontrol",
262  "/org/trinitydesktop/hardwarecontrol",
263  "org.trinitydesktop.hardwarecontrol.Power",
264  "CanSuspend");
265  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
266  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
267  return reply[0].toBool();
268  }
269  }
270  }
271 #endif // WITH_TDEHWLIB_DAEMONS
272 
273  return false;
274 }
275 
276 bool TDERootSystemDevice::canHibernate() {
277  TQString statenode = "/sys/power/state";
278  TQString disknode = "/sys/power/disk";
279  int state_rval = access (statenode.ascii(), W_OK);
280  int disk_rval = access (disknode.ascii(), W_OK);
281  if (state_rval == 0 && disk_rval == 0) {
282  if (powerStates().contains(TDESystemPowerState::Hibernate)) {
283  return true;
284  }
285  else {
286  return false;
287  }
288  }
289 
290 #ifdef WITH_LOGINDPOWER
291  {
292  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
293  if (dbusConn.isConnected()) {
294  // can hibernate?
295  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
296  "org.freedesktop.login1",
297  "/org/freedesktop/login1",
298  "org.freedesktop.login1.Manager",
299  "CanHibernate");
300  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
301  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
302  return (reply[0].toString() == "yes");
303  }
304  }
305  }
306 #endif // WITH_LOGINDPOWER
307 
308 #ifdef WITH_UPOWER
309  {
310  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
311  if (dbusConn.isConnected()) {
312  TQT_DBusProxy upowerProperties("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", dbusConn);
313  if (upowerProperties.canSend()) {
314  // can hibernate?
315  TQValueList<TQT_DBusData> params;
316  params << TQT_DBusData::fromString(upowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate");
317  TQT_DBusMessage reply = upowerProperties.sendWithReply("Get", params);
318  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
319  return reply[0].toVariant().value.toBool();
320  }
321  }
322  }
323  }
324 #endif// WITH_UPOWER
325 
326 #ifdef WITH_DEVKITPOWER
327  {
328  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
329  if (dbusConn.isConnected()) {
330  TQT_DBusProxy devkitpowerProperties("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power", "org.freedesktop.DBus.Properties", dbusConn);
331  if (devkitpowerProperties.canSend()) {
332  // can hibernate?
333  TQValueList<TQT_DBusData> params;
334  params << TQT_DBusData::fromString(devkitpowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate");
335  TQT_DBusMessage reply = devkitpowerProperties.sendWithReply("Get", params);
336  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
337  return reply[0].toVariant().value.toBool();
338  }
339  }
340  }
341  }
342 #endif// WITH_DEVKITPOWER
343 
344 #ifdef WITH_TDEHWLIB_DAEMONS
345  {
346  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
347  if (dbusConn.isConnected()) {
348  // can hibernate?
349  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
350  "org.trinitydesktop.hardwarecontrol",
351  "/org/trinitydesktop/hardwarecontrol",
352  "org.trinitydesktop.hardwarecontrol.Power",
353  "CanHibernate");
354  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
355  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
356  return reply[0].toBool();
357  }
358  }
359  }
360 #endif // WITH_TDEHWLIB_DAEMONS
361 
362  return false;
363 }
364 
365 bool TDERootSystemDevice::canHybridSuspend() {
366  TQString statenode = "/sys/power/state";
367  TQString disknode = "/sys/power/disk";
368  int state_rval = access (statenode.ascii(), W_OK);
369  int disk_rval = access (disknode.ascii(), W_OK);
370  if (state_rval == 0 && disk_rval == 0) {
371  if (powerStates().contains(TDESystemPowerState::HybridSuspend)) {
372  return true;
373  }
374  else {
375  return false;
376  }
377  }
378 
379 #ifdef WITH_LOGINDPOWER
380  {
381  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
382  if (dbusConn.isConnected()) {
383  // can hybrid suspend?
384  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
385  "org.freedesktop.login1",
386  "/org/freedesktop/login1",
387  "org.freedesktop.login1.Manager",
388  "CanHybridSleep");
389  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
390  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
391  return (reply[0].toString() == "yes");
392  }
393  }
394  }
395 #endif // WITH_LOGINDPOWER
396 
397  // No support "hybrid suspend" in org.freedesktop.UPower
398  // No support "hybrid suspend" in org.freedesktop.DeviceKit.Power
399 
400 #ifdef WITH_TDEHWLIB_DAEMONS
401  {
402  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
403  if (dbusConn.isConnected()) {
404  // can hybrid suspend?
405  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
406  "org.trinitydesktop.hardwarecontrol",
407  "/org/trinitydesktop/hardwarecontrol",
408  "org.trinitydesktop.hardwarecontrol.Power",
409  "CanHybridSuspend");
410  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
411  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
412  return reply[0].toBool();
413  }
414  }
415  }
416 #endif // WITH_TDEHWLIB_DAEMONS
417 
418  return false;
419 }
420 
421 bool TDERootSystemDevice::canPowerOff() {
422  TDEConfig config("ksmserverrc", true);
423  config.setGroup("General" );
424  if (!config.readBoolEntry( "offerShutdown", true )) {
425  return false;
426  }
427 
428 #ifdef WITH_LOGINDPOWER
429  {
430  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
431  if (dbusConn.isConnected()) {
432  // can power off?
433  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
434  "org.freedesktop.login1",
435  "/org/freedesktop/login1",
436  "org.freedesktop.login1.Manager",
437  "CanPowerOff");
438  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
439  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
440  return (reply[0].toString() == "yes");
441  }
442  }
443  }
444 #endif // WITH_LOGINDPOWER
445 
446 #ifdef WITH_CONSOLEKIT
447  {
448  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
449  if (dbusConn.isConnected()) {
450  // can power off?
451  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
452  "org.freedesktop.ConsoleKit",
453  "/org/freedesktop/ConsoleKit/Manager",
454  "org.freedesktop.ConsoleKit.Manager",
455  "CanStop");
456  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
457  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
458  return reply[0].toBool();
459  }
460  }
461  }
462 #endif // WITH_CONSOLEKIT
463 
464  // FIXME
465  // Can we power down this system?
466  // This should probably be checked via DCOP and therefore interface with TDM
467  // if ( DM().canShutdown() ) {
468  // return true;
469  // }
470  return true;
471 }
472 
473 bool TDERootSystemDevice::canReboot() {
474  TDEConfig config("ksmserverrc", true);
475  config.setGroup("General" );
476  if (!config.readBoolEntry( "offerShutdown", true )) {
477  return false;
478  }
479 
480 #ifdef WITH_LOGINDPOWER
481  {
482  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
483  if (dbusConn.isConnected()) {
484  // can reboot?
485  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
486  "org.freedesktop.login1",
487  "/org/freedesktop/login1",
488  "org.freedesktop.login1.Manager",
489  "CanReboot");
490  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
491  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
492  return (reply[0].toString() == "yes");
493  }
494  }
495  }
496 #endif // WITH_LOGINDPOWER
497 
498 #ifdef WITH_CONSOLEKIT
499  {
500  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
501  if (dbusConn.isConnected()) {
502  // can reboot?
503  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
504  "org.freedesktop.ConsoleKit",
505  "/org/freedesktop/ConsoleKit/Manager",
506  "org.freedesktop.ConsoleKit.Manager",
507  "CanRestart");
508  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
509  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
510  return reply[0].toBool();
511  }
512  }
513  }
514 #endif // WITH_CONSOLEKIT
515 
516  // FIXME
517  // Can we power down this system?
518  // This should probably be checked via DCOP and therefore interface with TDM
519  // if ( DM().canShutdown() ) {
520  // return true;
521  // }
522  return true;
523 }
524 
525 void TDERootSystemDevice::setHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm) {
526  TQString hibernationnode = "/sys/power/disk";
527  TQFile file( hibernationnode );
528  if ( file.open( IO_WriteOnly ) ) {
529  TQString hibernationCommand;
530  if (hm == TDESystemHibernationMethod::Platform) {
531  hibernationCommand = "platform";
532  }
533  else if (hm == TDESystemHibernationMethod::Shutdown) {
534  hibernationCommand = "shutdown";
535  }
536  else if (hm == TDESystemHibernationMethod::Reboot) {
537  hibernationCommand = "reboot";
538  }
539  else if (hm == TDESystemHibernationMethod::TestProc) {
540  hibernationCommand = "testproc";
541  }
542  else if (hm == TDESystemHibernationMethod::Test) {
543  hibernationCommand = "test";
544  }
545  else if (hm == TDESystemHibernationMethod::Suspend) {
546  hibernationCommand = "suspend";
547  }
548  TQTextStream stream( &file );
549  stream << hibernationCommand;
550  file.close();
551  return;
552  }
553 
554 #ifdef WITH_TDEHWLIB_DAEMONS
555  {
556  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
557  if (dbusConn.isConnected()) {
558  TQT_DBusProxy hardwareControl("org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", dbusConn);
559  if (hardwareControl.canSend()) {
560  // set hibernation method
561  TQValueList<TQT_DBusData> params;
562  TQString hibernationCommand;
563  if (hm == TDESystemHibernationMethod::Platform) {
564  hibernationCommand = "platform";
565  }
566  else if (hm == TDESystemHibernationMethod::Shutdown) {
567  hibernationCommand = "shutdown";
568  }
569  else if (hm == TDESystemHibernationMethod::Reboot) {
570  hibernationCommand = "reboot";
571  }
572  else if (hm == TDESystemHibernationMethod::TestProc) {
573  hibernationCommand = "testproc";
574  }
575  else if (hm == TDESystemHibernationMethod::Test) {
576  hibernationCommand = "test";
577  }
578  else if (hm == TDESystemHibernationMethod::Suspend) {
579  hibernationCommand = "suspend";
580  }
581  params << TQT_DBusData::fromString(hibernationCommand);
582  TQT_DBusMessage reply = hardwareControl.sendWithReply("SetHibernationMethod", params);
583  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
584  return;
585  }
586  }
587  }
588  }
589 #endif // WITH_TDEHWLIB_DAEMONS
590 
591 }
592 
593 bool TDERootSystemDevice::setPowerState(TDESystemPowerState::TDESystemPowerState ps) {
594  if ((ps == TDESystemPowerState::Freeze) || (ps == TDESystemPowerState::Standby) ||
595  (ps == TDESystemPowerState::Suspend) || (ps == TDESystemPowerState::Hibernate) ||
596  (ps == TDESystemPowerState::HybridSuspend)) {
597  TQString statenode = "/sys/power/state";
598  TQString disknode = "/sys/power/disk";
599  TQFile statefile( statenode );
600  TQFile diskfile( disknode );
601  if ( statefile.open( IO_WriteOnly ) &&
602  ((ps != TDESystemPowerState::Hibernate && ps != TDESystemPowerState::HybridSuspend) ||
603  diskfile.open( IO_WriteOnly )) ) {
604  TQString powerCommand;
605  if (ps == TDESystemPowerState::Freeze) {
606  powerCommand = "freeze";
607  }
608  else if (ps == TDESystemPowerState::Standby) {
609  powerCommand = "standby";
610  }
611  else if (ps == TDESystemPowerState::Suspend) {
612  powerCommand = "mem";
613  }
614  else if (ps == TDESystemPowerState::Hibernate) {
615  powerCommand = "disk";
616  TQTextStream diskstream( &diskfile );
617  diskstream << "platform";
618  diskfile.close();
619  }
620  else if (ps == TDESystemPowerState::HybridSuspend) {
621  powerCommand = "disk";
622  TQTextStream diskstream( &diskfile );
623  diskstream << "suspend";
624  diskfile.close();
625  }
626  TQTextStream statestream( &statefile );
627  statestream << powerCommand;
628  statefile.close();
629  return true;
630  }
631 
632 #ifdef WITH_LOGINDPOWER
633  {
634  // No support for "freeze" and "standby" in org.freedesktop.login1
635  TQT_DBusConnection dbusConn;
636  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
637  if ( dbusConn.isConnected() ) {
638  TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1",
639  "org.freedesktop.login1.Manager", dbusConn);
640  TQValueList<TQT_DBusData> params;
641  params << TQT_DBusData::fromBool(true);
642  if (logindProxy.canSend()) {
643  if (ps == TDESystemPowerState::Suspend) {
644  TQT_DBusMessage reply = logindProxy.sendWithReply("Suspend", params);
645  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
646  return true;
647  }
648  }
649  else if (ps == TDESystemPowerState::Hibernate) {
650  TQT_DBusMessage reply = logindProxy.sendWithReply("Hibernate", params);
651  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
652  return true;
653  }
654  }
655  else if (ps == TDESystemPowerState::HybridSuspend) {
656  TQT_DBusMessage reply = logindProxy.sendWithReply("HybridSleep", params);
657  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
658  return true;
659  }
660  }
661  }
662  }
663  }
664 #endif // WITH_LOGINDPOWER
665 
666 #ifdef WITH_UPOWER
667  {
668  // No support for "freeze" and "hybrid suspend" in org.freedesktop.UPower
669  TQT_DBusConnection dbusConn;
670  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
671  if ( dbusConn.isConnected() ) {
672  if (ps == TDESystemPowerState::Suspend) {
673  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
674  "org.freedesktop.UPower",
675  "/org/freedesktop/UPower",
676  "org.freedesktop.UPower",
677  "Suspend");
678  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
679  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
680  return true;
681  }
682  }
683  else if (ps == TDESystemPowerState::Hibernate) {
684  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
685  "org.freedesktop.UPower",
686  "/org/freedesktop/UPower",
687  "org.freedesktop.UPower",
688  "Hibernate");
689  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
690  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
691  return true;
692  }
693  }
694  }
695  }
696 #endif // WITH_UPOWER
697 
698 #ifdef WITH_DEVKITPOWER
699  {
700  // No support for "freeze" and "hybrid suspend" in org.freedesktop.DeviceKit.Power
701  TQT_DBusConnection dbusConn;
702  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
703  if ( dbusConn.isConnected() ) {
704  if (ps == TDESystemPowerState::Suspend) {
705  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
706  "org.freedesktop.DeviceKit.Power",
707  "/org/freedesktop/DeviceKit/Power",
708  "org.freedesktop.DeviceKit.Power",
709  "Suspend");
710  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
711  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
712  return true;
713  }
714  }
715  else if (ps == TDESystemPowerState::Hibernate) {
716  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
717  "org.freedesktop.DeviceKit.Power",
718  "/org/freedesktop/DeviceKit/Power",
719  "org.freedesktop.DeviceKit.Power",
720  "Hibernate");
721  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
722  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
723  return true;
724  }
725  }
726  }
727  }
728 #endif // WITH_DEVKITPOWER
729 
730 #ifdef WITH_TDEHWLIB_DAEMONS
731  {
732  TQT_DBusConnection dbusConn;
733  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
734  if ( dbusConn.isConnected() ) {
735  if (ps == TDESystemPowerState::Standby) {
736  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
737  "org.trinitydesktop.hardwarecontrol",
738  "/org/trinitydesktop/hardwarecontrol",
739  "org.trinitydesktop.hardwarecontrol.Power",
740  "Standby");
741  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
742  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
743  return true;
744  }
745  }
746  else if (ps == TDESystemPowerState::Freeze) {
747  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
748  "org.trinitydesktop.hardwarecontrol",
749  "/org/trinitydesktop/hardwarecontrol",
750  "org.trinitydesktop.hardwarecontrol.Power",
751  "Freeze");
752  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
753  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
754  return true;
755  }
756  }
757  else if (ps == TDESystemPowerState::Suspend) {
758  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
759  "org.trinitydesktop.hardwarecontrol",
760  "/org/trinitydesktop/hardwarecontrol",
761  "org.trinitydesktop.hardwarecontrol.Power",
762  "Suspend");
763  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
764  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
765  return true;
766  }
767  }
768  else if (ps == TDESystemPowerState::Hibernate) {
769  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
770  "org.trinitydesktop.hardwarecontrol",
771  "/org/trinitydesktop/hardwarecontrol",
772  "org.trinitydesktop.hardwarecontrol.Power",
773  "Hibernate");
774  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
775  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
776  return true;
777  }
778  }
779  else if (ps == TDESystemPowerState::HybridSuspend) {
780  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
781  "org.trinitydesktop.hardwarecontrol",
782  "/org/trinitydesktop/hardwarecontrol",
783  "org.trinitydesktop.hardwarecontrol.Power",
784  "HybridSuspend");
785  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
786  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
787  return true;
788  }
789  }
790  }
791  }
792 #endif // WITH_TDEHWLIB_DAEMONS
793 
794  return false;
795  }
796  else if (ps == TDESystemPowerState::PowerOff) {
797  TDEConfig config("ksmserverrc", true);
798  config.setGroup("General" );
799  if (!config.readBoolEntry( "offerShutdown", true )) {
800  return false;
801  }
802 #ifdef WITH_LOGINDPOWER
803  {
804  TQT_DBusConnection dbusConn;
805  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
806  if ( dbusConn.isConnected() ) {
807  TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1",
808  "org.freedesktop.login1.Manager", dbusConn);
809  TQValueList<TQT_DBusData> params;
810  params << TQT_DBusData::fromBool(true);
811  if (logindProxy.canSend()) {
812  TQT_DBusMessage reply = logindProxy.sendWithReply("PowerOff", params);
813  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
814  return true;
815  }
816  }
817  }
818  }
819 #endif // WITH_LOGINDPOWER
820 #ifdef WITH_CONSOLEKIT
821  {
822  TQT_DBusConnection dbusConn;
823  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
824  if ( dbusConn.isConnected() ) {
825  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
826  "org.freedesktop.ConsoleKit",
827  "/org/freedesktop/ConsoleKit/Manager",
828  "org.freedesktop.ConsoleKit.Manager",
829  "Stop");
830  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
831  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
832  return true;
833  }
834  }
835  }
836 #endif // WITH_CONSOLEKIT
837  // Power down the system using a DCOP command
838  /* As found at http://lists.kde.org/?l=kde-linux&m=115770988603387
839  Logout parameters explanation:
840  First parameter: confirm
841  Obey the user's confirmation setting: -1
842  Don't confirm, shutdown without asking: 0
843  Always confirm, ask even if the user turned it off: 1
844  Second parameter: type
845  Select previous action or the default if it's the first time: -1
846  Only log out: 0
847  Log out and reboot the machine: 1
848  Log out and halt the machine: 2
849  Third parameter: mode
850  Select previous mode or the default if it's the first time: -1
851  Schedule a shutdown (halt or reboot) for the time all active sessions have exited: 0
852  Shut down, if no sessions are active. Otherwise do nothing: 1
853  Force shutdown. Kill any possibly active sessions: 2
854  Pop up a dialog asking the user what to do if sessions are still active: 3
855  */
856  TQByteArray data;
857  TQDataStream arg(data, IO_WriteOnly);
858  arg << (int)0 << (int)2 << (int)2;
859  if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) {
860  return true;
861  }
862  return false;
863  }
864  else if (ps == TDESystemPowerState::Reboot) {
865  TDEConfig config("ksmserverrc", true);
866  config.setGroup("General" );
867  if (!config.readBoolEntry( "offerShutdown", true )) {
868  return false;
869  }
870 #ifdef WITH_LOGINDPOWER
871  {
872  TQT_DBusConnection dbusConn;
873  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
874  if ( dbusConn.isConnected() ) {
875  TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1",
876  "org.freedesktop.login1.Manager", dbusConn);
877  TQValueList<TQT_DBusData> params;
878  params << TQT_DBusData::fromBool(true);
879  if (logindProxy.canSend()) {
880  TQT_DBusMessage reply = logindProxy.sendWithReply("Reboot", params);
881  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
882  return true;
883  }
884  }
885  }
886  }
887 #endif // WITH_LOGINDPOWER
888 #ifdef WITH_CONSOLEKIT
889  {
890  TQT_DBusConnection dbusConn;
891  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
892  if ( dbusConn.isConnected() ) {
893  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
894  "org.freedesktop.ConsoleKit",
895  "/org/freedesktop/ConsoleKit/Manager",
896  "org.freedesktop.ConsoleKit.Manager",
897  "Restart");
898  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
899  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
900  return true;
901  }
902  }
903  }
904 #endif // WITH_CONSOLEKIT
905  // Power down the system using a DCOP command
906  // See above PowerOff section for logout() parameters explanation
907  TQByteArray data;
908  TQDataStream arg(data, IO_WriteOnly);
909  arg << (int)0 << (int)1 << (int)2;
910  if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) {
911  return true;
912  }
913  return false;
914  }
915  else if (ps == TDESystemPowerState::Active) {
916  // Ummm...we're already active...
917  return true;
918  }
919 
920  return false;
921 }
922 
923 #include "tderootsystemdevice.moc"
TDEConfig
Access KDE Configuration entries.
Definition: tdeconfig.h:44

tdecore

Skip menu "tdecore"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

tdecore

Skip menu "tdecore"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdecore by doxygen 1.9.1
This website is maintained by Timothy Pearson.