• 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  TQString statenode = "/sys/power/state";
153  int rval = access (statenode.ascii(), W_OK);
154  if (rval == 0) {
155  if (powerStates().contains(TDESystemPowerState::Freeze)) {
156  return true;
157  }
158  else {
159  return false;
160  }
161  }
162 
163 #ifdef WITH_TDEHWLIB_DAEMONS
164  {
165  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
166  if (dbusConn.isConnected()) {
167  // can freeze?
168  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
169  "org.trinitydesktop.hardwarecontrol",
170  "/org/trinitydesktop/hardwarecontrol",
171  "org.trinitydesktop.hardwarecontrol.Power",
172  "CanFreeze");
173  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
174  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
175  return reply[0].toBool();
176  }
177  }
178  }
179 #endif // WITH_TDEHWLIB_DAEMONS
180 
181  return false;
182 }
183 
184 bool TDERootSystemDevice::canSuspend() {
185  TQString statenode = "/sys/power/state";
186  int rval = access (statenode.ascii(), W_OK);
187  if (rval == 0) {
188  if (powerStates().contains(TDESystemPowerState::Suspend)) {
189  return true;
190  }
191  else {
192  return false;
193  }
194  }
195 
196 #ifdef WITH_LOGINDPOWER
197  {
198  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
199  if (dbusConn.isConnected()) {
200  // can suspend?
201  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
202  "org.freedesktop.login1",
203  "/org/freedesktop/login1",
204  "org.freedesktop.login1.Manager",
205  "CanSuspend");
206  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
207  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
208  return (reply[0].toString() == "yes");
209  }
210  }
211  }
212 #endif // WITH_LOGINDPOWER
213 
214 #ifdef WITH_UPOWER
215  {
216  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
217  if (dbusConn.isConnected()) {
218  TQT_DBusProxy upowerProperties("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", dbusConn);
219  if (upowerProperties.canSend()) {
220  // can suspend?
221  TQValueList<TQT_DBusData> params;
222  params << TQT_DBusData::fromString(upowerProperties.interface()) << TQT_DBusData::fromString("CanSuspend");
223  TQT_DBusMessage reply = upowerProperties.sendWithReply("Get", params);
224  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
225  return reply[0].toVariant().value.toBool();
226  }
227  }
228  }
229  }
230 #endif// WITH_UPOWER
231 
232 #ifdef WITH_DEVKITPOWER
233  {
234  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
235  if (dbusConn.isConnected()) {
236  TQT_DBusProxy devkitpowerProperties("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power", "org.freedesktop.DBus.Properties", dbusConn);
237  if (devkitpowerProperties.canSend()) {
238  // can suspend?
239  TQValueList<TQT_DBusData> params;
240  params << TQT_DBusData::fromString(devkitpowerProperties.interface()) << TQT_DBusData::fromString("CanSuspend");
241  TQT_DBusMessage reply = devkitpowerProperties.sendWithReply("Get", params);
242  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
243  return reply[0].toVariant().value.toBool();
244  }
245  }
246  }
247  }
248 #endif// WITH_DEVKITPOWER
249 
250 #ifdef WITH_TDEHWLIB_DAEMONS
251  {
252  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
253  if (dbusConn.isConnected()) {
254  // can suspend?
255  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
256  "org.trinitydesktop.hardwarecontrol",
257  "/org/trinitydesktop/hardwarecontrol",
258  "org.trinitydesktop.hardwarecontrol.Power",
259  "CanSuspend");
260  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
261  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
262  return reply[0].toBool();
263  }
264  }
265  }
266 #endif // WITH_TDEHWLIB_DAEMONS
267 
268  return false;
269 }
270 
271 bool TDERootSystemDevice::canHibernate() {
272  TQString statenode = "/sys/power/state";
273  TQString disknode = "/sys/power/disk";
274  int state_rval = access (statenode.ascii(), W_OK);
275  int disk_rval = access (disknode.ascii(), W_OK);
276  if (state_rval == 0 && disk_rval == 0) {
277  if (powerStates().contains(TDESystemPowerState::Hibernate)) {
278  return true;
279  }
280  else {
281  return false;
282  }
283  }
284 
285 #ifdef WITH_LOGINDPOWER
286  {
287  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
288  if (dbusConn.isConnected()) {
289  // can hibernate?
290  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
291  "org.freedesktop.login1",
292  "/org/freedesktop/login1",
293  "org.freedesktop.login1.Manager",
294  "CanHibernate");
295  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
296  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
297  return (reply[0].toString() == "yes");
298  }
299  }
300  }
301 #endif // WITH_LOGINDPOWER
302 
303 #ifdef WITH_UPOWER
304  {
305  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
306  if (dbusConn.isConnected()) {
307  TQT_DBusProxy upowerProperties("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", dbusConn);
308  if (upowerProperties.canSend()) {
309  // can hibernate?
310  TQValueList<TQT_DBusData> params;
311  params << TQT_DBusData::fromString(upowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate");
312  TQT_DBusMessage reply = upowerProperties.sendWithReply("Get", params);
313  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
314  return reply[0].toVariant().value.toBool();
315  }
316  }
317  }
318  }
319 #endif// WITH_UPOWER
320 
321 #ifdef WITH_DEVKITPOWER
322  {
323  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
324  if (dbusConn.isConnected()) {
325  TQT_DBusProxy devkitpowerProperties("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power", "org.freedesktop.DBus.Properties", dbusConn);
326  if (devkitpowerProperties.canSend()) {
327  // can hibernate?
328  TQValueList<TQT_DBusData> params;
329  params << TQT_DBusData::fromString(devkitpowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate");
330  TQT_DBusMessage reply = devkitpowerProperties.sendWithReply("Get", params);
331  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
332  return reply[0].toVariant().value.toBool();
333  }
334  }
335  }
336  }
337 #endif// WITH_DEVKITPOWER
338 
339 #ifdef WITH_TDEHWLIB_DAEMONS
340  {
341  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
342  if (dbusConn.isConnected()) {
343  // can hibernate?
344  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
345  "org.trinitydesktop.hardwarecontrol",
346  "/org/trinitydesktop/hardwarecontrol",
347  "org.trinitydesktop.hardwarecontrol.Power",
348  "CanHibernate");
349  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
350  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
351  return reply[0].toBool();
352  }
353  }
354  }
355 #endif // WITH_TDEHWLIB_DAEMONS
356 
357  return false;
358 }
359 
360 bool TDERootSystemDevice::canHybridSuspend() {
361  TQString statenode = "/sys/power/state";
362  TQString disknode = "/sys/power/disk";
363  int state_rval = access (statenode.ascii(), W_OK);
364  int disk_rval = access (disknode.ascii(), W_OK);
365  if (state_rval == 0 && disk_rval == 0) {
366  if (powerStates().contains(TDESystemPowerState::HybridSuspend)) {
367  return true;
368  }
369  else {
370  return false;
371  }
372  }
373 
374 #ifdef WITH_LOGINDPOWER
375  {
376  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
377  if (dbusConn.isConnected()) {
378  // can hybrid suspend?
379  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
380  "org.freedesktop.login1",
381  "/org/freedesktop/login1",
382  "org.freedesktop.login1.Manager",
383  "CanHybridSleep");
384  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
385  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
386  return (reply[0].toString() == "yes");
387  }
388  }
389  }
390 #endif // WITH_LOGINDPOWER
391 
392  // No support "hybrid suspend" in org.freedesktop.UPower
393  // No support "hybrid suspend" in org.freedesktop.DeviceKit.Power
394 
395 #ifdef WITH_TDEHWLIB_DAEMONS
396  {
397  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
398  if (dbusConn.isConnected()) {
399  // can hybrid suspend?
400  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
401  "org.trinitydesktop.hardwarecontrol",
402  "/org/trinitydesktop/hardwarecontrol",
403  "org.trinitydesktop.hardwarecontrol.Power",
404  "CanHybridSuspend");
405  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
406  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
407  return reply[0].toBool();
408  }
409  }
410  }
411 #endif // WITH_TDEHWLIB_DAEMONS
412 
413  return false;
414 }
415 
416 bool TDERootSystemDevice::canPowerOff() {
417  TDEConfig config("ksmserverrc", true);
418  config.setGroup("General" );
419  if (!config.readBoolEntry( "offerShutdown", true )) {
420  return false;
421  }
422 
423 #ifdef WITH_LOGINDPOWER
424  {
425  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
426  if (dbusConn.isConnected()) {
427  // can power off?
428  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
429  "org.freedesktop.login1",
430  "/org/freedesktop/login1",
431  "org.freedesktop.login1.Manager",
432  "CanPowerOff");
433  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
434  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
435  return (reply[0].toString() == "yes");
436  }
437  }
438  }
439 #endif // WITH_LOGINDPOWER
440 
441 #ifdef WITH_CONSOLEKIT
442  {
443  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
444  if (dbusConn.isConnected()) {
445  // can power off?
446  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
447  "org.freedesktop.ConsoleKit",
448  "/org/freedesktop/ConsoleKit/Manager",
449  "org.freedesktop.ConsoleKit.Manager",
450  "CanStop");
451  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
452  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
453  return reply[0].toBool();
454  }
455  }
456  }
457 #endif // WITH_CONSOLEKIT
458 
459  // FIXME
460  // Can we power down this system?
461  // This should probably be checked via DCOP and therefore interface with TDM
462  // if ( DM().canShutdown() ) {
463  // return true;
464  // }
465  return true;
466 }
467 
468 bool TDERootSystemDevice::canReboot() {
469  TDEConfig config("ksmserverrc", true);
470  config.setGroup("General" );
471  if (!config.readBoolEntry( "offerShutdown", true )) {
472  return false;
473  }
474 
475 #ifdef WITH_LOGINDPOWER
476  {
477  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
478  if (dbusConn.isConnected()) {
479  // can reboot?
480  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
481  "org.freedesktop.login1",
482  "/org/freedesktop/login1",
483  "org.freedesktop.login1.Manager",
484  "CanReboot");
485  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
486  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
487  return (reply[0].toString() == "yes");
488  }
489  }
490  }
491 #endif // WITH_LOGINDPOWER
492 
493 #ifdef WITH_CONSOLEKIT
494  {
495  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
496  if (dbusConn.isConnected()) {
497  // can reboot?
498  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
499  "org.freedesktop.ConsoleKit",
500  "/org/freedesktop/ConsoleKit/Manager",
501  "org.freedesktop.ConsoleKit.Manager",
502  "CanRestart");
503  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
504  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
505  return reply[0].toBool();
506  }
507  }
508  }
509 #endif // WITH_CONSOLEKIT
510 
511  // FIXME
512  // Can we power down this system?
513  // This should probably be checked via DCOP and therefore interface with TDM
514  // if ( DM().canShutdown() ) {
515  // return true;
516  // }
517  return true;
518 }
519 
520 void TDERootSystemDevice::setHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm) {
521  TQString hibernationnode = "/sys/power/disk";
522  TQFile file( hibernationnode );
523  if ( file.open( IO_WriteOnly ) ) {
524  TQString hibernationCommand;
525  if (hm == TDESystemHibernationMethod::Platform) {
526  hibernationCommand = "platform";
527  }
528  else if (hm == TDESystemHibernationMethod::Shutdown) {
529  hibernationCommand = "shutdown";
530  }
531  else if (hm == TDESystemHibernationMethod::Reboot) {
532  hibernationCommand = "reboot";
533  }
534  else if (hm == TDESystemHibernationMethod::TestProc) {
535  hibernationCommand = "testproc";
536  }
537  else if (hm == TDESystemHibernationMethod::Test) {
538  hibernationCommand = "test";
539  }
540  else if (hm == TDESystemHibernationMethod::Suspend) {
541  hibernationCommand = "suspend";
542  }
543  TQTextStream stream( &file );
544  stream << hibernationCommand;
545  file.close();
546  return;
547  }
548 
549 #ifdef WITH_TDEHWLIB_DAEMONS
550  {
551  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
552  if (dbusConn.isConnected()) {
553  TQT_DBusProxy hardwareControl("org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", dbusConn);
554  if (hardwareControl.canSend()) {
555  // set hibernation method
556  TQValueList<TQT_DBusData> params;
557  TQString hibernationCommand;
558  if (hm == TDESystemHibernationMethod::Platform) {
559  hibernationCommand = "platform";
560  }
561  else if (hm == TDESystemHibernationMethod::Shutdown) {
562  hibernationCommand = "shutdown";
563  }
564  else if (hm == TDESystemHibernationMethod::Reboot) {
565  hibernationCommand = "reboot";
566  }
567  else if (hm == TDESystemHibernationMethod::TestProc) {
568  hibernationCommand = "testproc";
569  }
570  else if (hm == TDESystemHibernationMethod::Test) {
571  hibernationCommand = "test";
572  }
573  else if (hm == TDESystemHibernationMethod::Suspend) {
574  hibernationCommand = "suspend";
575  }
576  params << TQT_DBusData::fromString(hibernationCommand);
577  TQT_DBusMessage reply = hardwareControl.sendWithReply("SetHibernationMethod", params);
578  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
579  return;
580  }
581  }
582  }
583  }
584 #endif // WITH_TDEHWLIB_DAEMONS
585 
586 }
587 
588 bool TDERootSystemDevice::setPowerState(TDESystemPowerState::TDESystemPowerState ps) {
589  if ((ps == TDESystemPowerState::Freeze) || (ps == TDESystemPowerState::Standby) ||
590  (ps == TDESystemPowerState::Suspend) || (ps == TDESystemPowerState::Hibernate) ||
591  (ps == TDESystemPowerState::HybridSuspend)) {
592  TQString statenode = "/sys/power/state";
593  TQString disknode = "/sys/power/disk";
594  TQFile statefile( statenode );
595  TQFile diskfile( disknode );
596  if ( statefile.open( IO_WriteOnly ) &&
597  ((ps != TDESystemPowerState::Hibernate && ps != TDESystemPowerState::HybridSuspend) ||
598  diskfile.open( IO_WriteOnly )) ) {
599  TQString powerCommand;
600  if (ps == TDESystemPowerState::Freeze) {
601  powerCommand = "freeze";
602  }
603  else if (ps == TDESystemPowerState::Standby) {
604  powerCommand = "standby";
605  }
606  else if (ps == TDESystemPowerState::Suspend) {
607  powerCommand = "mem";
608  }
609  else if (ps == TDESystemPowerState::Hibernate) {
610  powerCommand = "disk";
611  TQTextStream diskstream( &diskfile );
612  diskstream << "platform";
613  diskfile.close();
614  }
615  else if (ps == TDESystemPowerState::HybridSuspend) {
616  powerCommand = "disk";
617  TQTextStream diskstream( &diskfile );
618  diskstream << "suspend";
619  diskfile.close();
620  }
621  TQTextStream statestream( &statefile );
622  statestream << powerCommand;
623  statefile.close();
624  return true;
625  }
626 
627 #ifdef WITH_LOGINDPOWER
628  {
629  // No support for "freeze" and "standby" in org.freedesktop.login1
630  TQT_DBusConnection dbusConn;
631  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
632  if ( dbusConn.isConnected() ) {
633  TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1",
634  "org.freedesktop.login1.Manager", dbusConn);
635  TQValueList<TQT_DBusData> params;
636  params << TQT_DBusData::fromBool(true);
637  if (logindProxy.canSend()) {
638  if (ps == TDESystemPowerState::Suspend) {
639  TQT_DBusMessage reply = logindProxy.sendWithReply("Suspend", params);
640  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
641  return true;
642  }
643  }
644  else if (ps == TDESystemPowerState::Hibernate) {
645  TQT_DBusMessage reply = logindProxy.sendWithReply("Hibernate", params);
646  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
647  return true;
648  }
649  }
650  else if (ps == TDESystemPowerState::HybridSuspend) {
651  TQT_DBusMessage reply = logindProxy.sendWithReply("HybridSleep", params);
652  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
653  return true;
654  }
655  }
656  }
657  }
658  }
659 #endif // WITH_LOGINDPOWER
660 
661 #ifdef WITH_UPOWER
662  {
663  // No support for "freeze" and "hybrid suspend" in org.freedesktop.UPower
664  TQT_DBusConnection dbusConn;
665  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
666  if ( dbusConn.isConnected() ) {
667  if (ps == TDESystemPowerState::Suspend) {
668  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
669  "org.freedesktop.UPower",
670  "/org/freedesktop/UPower",
671  "org.freedesktop.UPower",
672  "Suspend");
673  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
674  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
675  return true;
676  }
677  }
678  else if (ps == TDESystemPowerState::Hibernate) {
679  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
680  "org.freedesktop.UPower",
681  "/org/freedesktop/UPower",
682  "org.freedesktop.UPower",
683  "Hibernate");
684  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
685  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
686  return true;
687  }
688  }
689  }
690  }
691 #endif // WITH_UPOWER
692 
693 #ifdef WITH_DEVKITPOWER
694  {
695  // No support for "freeze" and "hybrid suspend" in org.freedesktop.DeviceKit.Power
696  TQT_DBusConnection dbusConn;
697  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
698  if ( dbusConn.isConnected() ) {
699  if (ps == TDESystemPowerState::Suspend) {
700  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
701  "org.freedesktop.DeviceKit.Power",
702  "/org/freedesktop/DeviceKit/Power",
703  "org.freedesktop.DeviceKit.Power",
704  "Suspend");
705  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
706  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
707  return true;
708  }
709  }
710  else if (ps == TDESystemPowerState::Hibernate) {
711  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
712  "org.freedesktop.DeviceKit.Power",
713  "/org/freedesktop/DeviceKit/Power",
714  "org.freedesktop.DeviceKit.Power",
715  "Hibernate");
716  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
717  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
718  return true;
719  }
720  }
721  }
722  }
723 #endif // WITH_DEVKITPOWER
724 
725 #ifdef WITH_TDEHWLIB_DAEMONS
726  {
727  TQT_DBusConnection dbusConn;
728  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
729  if ( dbusConn.isConnected() ) {
730  if (ps == TDESystemPowerState::Standby) {
731  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
732  "org.trinitydesktop.hardwarecontrol",
733  "/org/trinitydesktop/hardwarecontrol",
734  "org.trinitydesktop.hardwarecontrol.Power",
735  "Standby");
736  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
737  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
738  return true;
739  }
740  }
741  else if (ps == TDESystemPowerState::Freeze) {
742  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
743  "org.trinitydesktop.hardwarecontrol",
744  "/org/trinitydesktop/hardwarecontrol",
745  "org.trinitydesktop.hardwarecontrol.Power",
746  "Freeze");
747  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
748  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
749  return true;
750  }
751  }
752  else if (ps == TDESystemPowerState::Suspend) {
753  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
754  "org.trinitydesktop.hardwarecontrol",
755  "/org/trinitydesktop/hardwarecontrol",
756  "org.trinitydesktop.hardwarecontrol.Power",
757  "Suspend");
758  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
759  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
760  return true;
761  }
762  }
763  else if (ps == TDESystemPowerState::Hibernate) {
764  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
765  "org.trinitydesktop.hardwarecontrol",
766  "/org/trinitydesktop/hardwarecontrol",
767  "org.trinitydesktop.hardwarecontrol.Power",
768  "Hibernate");
769  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
770  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
771  return true;
772  }
773  }
774  else if (ps == TDESystemPowerState::HybridSuspend) {
775  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
776  "org.trinitydesktop.hardwarecontrol",
777  "/org/trinitydesktop/hardwarecontrol",
778  "org.trinitydesktop.hardwarecontrol.Power",
779  "HybridSuspend");
780  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
781  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
782  return true;
783  }
784  }
785  }
786  }
787 #endif // WITH_TDEHWLIB_DAEMONS
788 
789  return false;
790  }
791  else if (ps == TDESystemPowerState::PowerOff) {
792  TDEConfig config("ksmserverrc", true);
793  config.setGroup("General" );
794  if (!config.readBoolEntry( "offerShutdown", true )) {
795  return false;
796  }
797 #ifdef WITH_LOGINDPOWER
798  {
799  TQT_DBusConnection dbusConn;
800  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
801  if ( dbusConn.isConnected() ) {
802  TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1",
803  "org.freedesktop.login1.Manager", dbusConn);
804  TQValueList<TQT_DBusData> params;
805  params << TQT_DBusData::fromBool(true);
806  if (logindProxy.canSend()) {
807  TQT_DBusMessage reply = logindProxy.sendWithReply("PowerOff", params);
808  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
809  return true;
810  }
811  }
812  }
813  }
814 #endif // WITH_LOGINDPOWER
815 #ifdef WITH_CONSOLEKIT
816  {
817  TQT_DBusConnection dbusConn;
818  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
819  if ( dbusConn.isConnected() ) {
820  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
821  "org.freedesktop.ConsoleKit",
822  "/org/freedesktop/ConsoleKit/Manager",
823  "org.freedesktop.ConsoleKit.Manager",
824  "Stop");
825  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
826  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
827  return true;
828  }
829  }
830  }
831 #endif // WITH_CONSOLEKIT
832  // Power down the system using a DCOP command
833  /* As found at http://lists.kde.org/?l=kde-linux&m=115770988603387
834  Logout parameters explanation:
835  First parameter: confirm
836  Obey the user's confirmation setting: -1
837  Don't confirm, shutdown without asking: 0
838  Always confirm, ask even if the user turned it off: 1
839  Second parameter: type
840  Select previous action or the default if it's the first time: -1
841  Only log out: 0
842  Log out and reboot the machine: 1
843  Log out and halt the machine: 2
844  Third parameter: mode
845  Select previous mode or the default if it's the first time: -1
846  Schedule a shutdown (halt or reboot) for the time all active sessions have exited: 0
847  Shut down, if no sessions are active. Otherwise do nothing: 1
848  Force shutdown. Kill any possibly active sessions: 2
849  Pop up a dialog asking the user what to do if sessions are still active: 3
850  */
851  TQByteArray data;
852  TQDataStream arg(data, IO_WriteOnly);
853  arg << (int)0 << (int)2 << (int)2;
854  if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) {
855  return true;
856  }
857  return false;
858  }
859  else if (ps == TDESystemPowerState::Reboot) {
860  TDEConfig config("ksmserverrc", true);
861  config.setGroup("General" );
862  if (!config.readBoolEntry( "offerShutdown", true )) {
863  return false;
864  }
865 #ifdef WITH_LOGINDPOWER
866  {
867  TQT_DBusConnection dbusConn;
868  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
869  if ( dbusConn.isConnected() ) {
870  TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1",
871  "org.freedesktop.login1.Manager", dbusConn);
872  TQValueList<TQT_DBusData> params;
873  params << TQT_DBusData::fromBool(true);
874  if (logindProxy.canSend()) {
875  TQT_DBusMessage reply = logindProxy.sendWithReply("Reboot", params);
876  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
877  return true;
878  }
879  }
880  }
881  }
882 #endif // WITH_LOGINDPOWER
883 #ifdef WITH_CONSOLEKIT
884  {
885  TQT_DBusConnection dbusConn;
886  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
887  if ( dbusConn.isConnected() ) {
888  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
889  "org.freedesktop.ConsoleKit",
890  "/org/freedesktop/ConsoleKit/Manager",
891  "org.freedesktop.ConsoleKit.Manager",
892  "Restart");
893  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
894  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
895  return true;
896  }
897  }
898  }
899 #endif // WITH_CONSOLEKIT
900  // Power down the system using a DCOP command
901  // See above PowerOff section for logout() parameters explanation
902  TQByteArray data;
903  TQDataStream arg(data, IO_WriteOnly);
904  arg << (int)0 << (int)1 << (int)2;
905  if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) {
906  return true;
907  }
908  return false;
909  }
910  else if (ps == TDESystemPowerState::Active) {
911  // Ummm...we're already active...
912  return true;
913  }
914 
915  return false;
916 }
917 
918 #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.