• 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_HAL) || 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 // defined(WITH_TDEHWLIB_DAEMONS) || defined(WITH_UPOWER) || defined(WITH_DEVKITPOWER) || defined(WITH_HAL) || defined(WITH_CONSOLEKIT)
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_HAL
251  {
252  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
253  if (dbusConn.isConnected()) {
254  TQT_DBusProxy halProperties("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device", dbusConn);
255  if (halProperties.canSend()) {
256  // can suspend?
257  TQValueList<TQT_DBusData> params;
258  TQT_DBusMessage reply;
259  params.clear();
260  params << TQT_DBusData::fromString("power_management.can_suspend");
261  reply = halProperties.sendWithReply("GetPropertyBoolean", params);
262  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
263  return reply[0].toBool();
264  }
265  params.clear();
266  params << TQT_DBusData::fromString("power_management.can_suspend_to_ram");
267  reply = halProperties.sendWithReply("GetPropertyBoolean", params);
268  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
269  return reply[0].toBool();
270  }
271  }
272  }
273  }
274 #endif // WITH_HAL
275 
276 #ifdef WITH_TDEHWLIB_DAEMONS
277  {
278  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
279  if (dbusConn.isConnected()) {
280  // can suspend?
281  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
282  "org.trinitydesktop.hardwarecontrol",
283  "/org/trinitydesktop/hardwarecontrol",
284  "org.trinitydesktop.hardwarecontrol.Power",
285  "CanSuspend");
286  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
287  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
288  return reply[0].toBool();
289  }
290  }
291  }
292 #endif // WITH_TDEHWLIB_DAEMONS
293 
294  return false;
295 }
296 
297 bool TDERootSystemDevice::canHibernate() {
298  TQString statenode = "/sys/power/state";
299  TQString disknode = "/sys/power/disk";
300  int state_rval = access (statenode.ascii(), W_OK);
301  int disk_rval = access (disknode.ascii(), W_OK);
302  if (state_rval == 0 && disk_rval == 0) {
303  if (powerStates().contains(TDESystemPowerState::Hibernate)) {
304  return true;
305  }
306  else {
307  return false;
308  }
309  }
310 
311 #ifdef WITH_LOGINDPOWER
312  {
313  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
314  if (dbusConn.isConnected()) {
315  // can hibernate?
316  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
317  "org.freedesktop.login1",
318  "/org/freedesktop/login1",
319  "org.freedesktop.login1.Manager",
320  "CanHibernate");
321  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
322  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
323  return (reply[0].toString() == "yes");
324  }
325  }
326  }
327 #endif // WITH_LOGINDPOWER
328 
329 #ifdef WITH_UPOWER
330  {
331  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
332  if (dbusConn.isConnected()) {
333  TQT_DBusProxy upowerProperties("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.DBus.Properties", dbusConn);
334  if (upowerProperties.canSend()) {
335  // can hibernate?
336  TQValueList<TQT_DBusData> params;
337  params << TQT_DBusData::fromString(upowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate");
338  TQT_DBusMessage reply = upowerProperties.sendWithReply("Get", params);
339  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
340  return reply[0].toVariant().value.toBool();
341  }
342  }
343  }
344  }
345 #endif// WITH_UPOWER
346 
347 #ifdef WITH_DEVKITPOWER
348  {
349  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
350  if (dbusConn.isConnected()) {
351  TQT_DBusProxy devkitpowerProperties("org.freedesktop.DeviceKit.Power", "/org/freedesktop/DeviceKit/Power", "org.freedesktop.DBus.Properties", dbusConn);
352  if (devkitpowerProperties.canSend()) {
353  // can hibernate?
354  TQValueList<TQT_DBusData> params;
355  params << TQT_DBusData::fromString(devkitpowerProperties.interface()) << TQT_DBusData::fromString("CanHibernate");
356  TQT_DBusMessage reply = devkitpowerProperties.sendWithReply("Get", params);
357  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
358  return reply[0].toVariant().value.toBool();
359  }
360  }
361  }
362  }
363 #endif// WITH_DEVKITPOWER
364 
365 #ifdef WITH_HAL
366  {
367  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
368  if (dbusConn.isConnected()) {
369  TQT_DBusProxy halProperties("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device", dbusConn);
370  if (halProperties.canSend()) {
371  // can hibernate?
372  TQValueList<TQT_DBusData> params;
373  TQT_DBusMessage reply;
374  params.clear();
375  params << TQT_DBusData::fromString("power_management.can_hibernate");
376  reply = halProperties.sendWithReply("GetPropertyBoolean", params);
377  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
378  return reply[0].toBool();
379  }
380  params.clear();
381  params << TQT_DBusData::fromString("power_management.can_suspend_to_disk");
382  reply = halProperties.sendWithReply("GetPropertyBoolean", params);
383  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
384  return reply[0].toBool();
385  }
386  }
387  }
388  }
389 #endif // WITH_HAL
390 
391 #ifdef WITH_TDEHWLIB_DAEMONS
392  {
393  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
394  if (dbusConn.isConnected()) {
395  // can hibernate?
396  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
397  "org.trinitydesktop.hardwarecontrol",
398  "/org/trinitydesktop/hardwarecontrol",
399  "org.trinitydesktop.hardwarecontrol.Power",
400  "CanHibernate");
401  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
402  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
403  return reply[0].toBool();
404  }
405  }
406  }
407 #endif // WITH_TDEHWLIB_DAEMONS
408 
409  return false;
410 }
411 
412 bool TDERootSystemDevice::canHybridSuspend() {
413  TQString statenode = "/sys/power/state";
414  TQString disknode = "/sys/power/disk";
415  int state_rval = access (statenode.ascii(), W_OK);
416  int disk_rval = access (disknode.ascii(), W_OK);
417  if (state_rval == 0 && disk_rval == 0) {
418  if (powerStates().contains(TDESystemPowerState::HybridSuspend)) {
419  return true;
420  }
421  else {
422  return false;
423  }
424  }
425 
426 #ifdef WITH_LOGINDPOWER
427  {
428  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
429  if (dbusConn.isConnected()) {
430  // can hybrid suspend?
431  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
432  "org.freedesktop.login1",
433  "/org/freedesktop/login1",
434  "org.freedesktop.login1.Manager",
435  "CanHybridSleep");
436  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
437  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
438  return (reply[0].toString() == "yes");
439  }
440  }
441  }
442 #endif // WITH_LOGINDPOWER
443 
444  // No support "hybrid suspend" in org.freedesktop.UPower
445  // No support "hybrid suspend" in org.freedesktop.DeviceKit.Power
446 
447 #ifdef WITH_HAL
448  {
449  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
450  if (dbusConn.isConnected()) {
451  TQT_DBusProxy halProperties("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device", dbusConn);
452  if (halProperties.canSend()) {
453  // can hybrid suspend?
454  TQValueList<TQT_DBusData> params;
455  TQT_DBusMessage reply;
456  params.clear();
457  params << TQT_DBusData::fromString("power_management.can_suspend_hybrid");
458  reply = halProperties.sendWithReply("GetPropertyBoolean", params);
459  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
460  return reply[0].toBool();
461  }
462  }
463  }
464  }
465 #endif // WITH_HAL
466 
467 #ifdef WITH_TDEHWLIB_DAEMONS
468  {
469  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
470  if (dbusConn.isConnected()) {
471  // can hybrid suspend?
472  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
473  "org.trinitydesktop.hardwarecontrol",
474  "/org/trinitydesktop/hardwarecontrol",
475  "org.trinitydesktop.hardwarecontrol.Power",
476  "CanHybridSuspend");
477  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
478  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
479  return reply[0].toBool();
480  }
481  }
482  }
483 #endif // WITH_TDEHWLIB_DAEMONS
484 
485  return false;
486 }
487 
488 bool TDERootSystemDevice::canPowerOff() {
489  TDEConfig config("ksmserverrc", true);
490  config.setGroup("General" );
491  if (!config.readBoolEntry( "offerShutdown", true )) {
492  return false;
493  }
494 
495 #ifdef WITH_LOGINDPOWER
496  {
497  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
498  if (dbusConn.isConnected()) {
499  // can power off?
500  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
501  "org.freedesktop.login1",
502  "/org/freedesktop/login1",
503  "org.freedesktop.login1.Manager",
504  "CanPowerOff");
505  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
506  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
507  return (reply[0].toString() == "yes");
508  }
509  }
510  }
511 #endif // WITH_LOGINDPOWER
512 
513 #ifdef WITH_CONSOLEKIT
514  {
515  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
516  if (dbusConn.isConnected()) {
517  // can power off?
518  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
519  "org.freedesktop.ConsoleKit",
520  "/org/freedesktop/ConsoleKit/Manager",
521  "org.freedesktop.ConsoleKit.Manager",
522  "CanStop");
523  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
524  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
525  return reply[0].toBool();
526  }
527  }
528  }
529 #endif // WITH_CONSOLEKIT
530 
531  // FIXME
532  // Can we power down this system?
533  // This should probably be checked via DCOP and therefore interface with TDM
534  // if ( DM().canShutdown() ) {
535  // return true;
536  // }
537  return true;
538 }
539 
540 bool TDERootSystemDevice::canReboot() {
541  TDEConfig config("ksmserverrc", true);
542  config.setGroup("General" );
543  if (!config.readBoolEntry( "offerShutdown", true )) {
544  return false;
545  }
546 
547 #ifdef WITH_LOGINDPOWER
548  {
549  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
550  if (dbusConn.isConnected()) {
551  // can reboot?
552  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
553  "org.freedesktop.login1",
554  "/org/freedesktop/login1",
555  "org.freedesktop.login1.Manager",
556  "CanReboot");
557  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
558  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
559  return (reply[0].toString() == "yes");
560  }
561  }
562  }
563 #endif // WITH_LOGINDPOWER
564 
565 #ifdef WITH_CONSOLEKIT
566  {
567  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
568  if (dbusConn.isConnected()) {
569  // can reboot?
570  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
571  "org.freedesktop.ConsoleKit",
572  "/org/freedesktop/ConsoleKit/Manager",
573  "org.freedesktop.ConsoleKit.Manager",
574  "CanRestart");
575  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
576  if (reply.type() == TQT_DBusMessage::ReplyMessage && reply.count() == 1) {
577  return reply[0].toBool();
578  }
579  }
580  }
581 #endif // WITH_CONSOLEKIT
582 
583  // FIXME
584  // Can we power down this system?
585  // This should probably be checked via DCOP and therefore interface with TDM
586  // if ( DM().canShutdown() ) {
587  // return true;
588  // }
589  return true;
590 }
591 
592 void TDERootSystemDevice::setHibernationMethod(TDESystemHibernationMethod::TDESystemHibernationMethod hm) {
593  TQString hibernationnode = "/sys/power/disk";
594  TQFile file( hibernationnode );
595  if ( file.open( IO_WriteOnly ) ) {
596  TQString hibernationCommand;
597  if (hm == TDESystemHibernationMethod::Platform) {
598  hibernationCommand = "platform";
599  }
600  else if (hm == TDESystemHibernationMethod::Shutdown) {
601  hibernationCommand = "shutdown";
602  }
603  else if (hm == TDESystemHibernationMethod::Reboot) {
604  hibernationCommand = "reboot";
605  }
606  else if (hm == TDESystemHibernationMethod::TestProc) {
607  hibernationCommand = "testproc";
608  }
609  else if (hm == TDESystemHibernationMethod::Test) {
610  hibernationCommand = "test";
611  }
612  else if (hm == TDESystemHibernationMethod::Suspend) {
613  hibernationCommand = "suspend";
614  }
615  TQTextStream stream( &file );
616  stream << hibernationCommand;
617  file.close();
618  return;
619  }
620 
621 #ifdef WITH_TDEHWLIB_DAEMONS
622  {
623  TQT_DBusConnection dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
624  if (dbusConn.isConnected()) {
625  TQT_DBusProxy hardwareControl("org.trinitydesktop.hardwarecontrol", "/org/trinitydesktop/hardwarecontrol", "org.trinitydesktop.hardwarecontrol.Power", dbusConn);
626  if (hardwareControl.canSend()) {
627  // set hibernation method
628  TQValueList<TQT_DBusData> params;
629  TQString hibernationCommand;
630  if (hm == TDESystemHibernationMethod::Platform) {
631  hibernationCommand = "platform";
632  }
633  else if (hm == TDESystemHibernationMethod::Shutdown) {
634  hibernationCommand = "shutdown";
635  }
636  else if (hm == TDESystemHibernationMethod::Reboot) {
637  hibernationCommand = "reboot";
638  }
639  else if (hm == TDESystemHibernationMethod::TestProc) {
640  hibernationCommand = "testproc";
641  }
642  else if (hm == TDESystemHibernationMethod::Test) {
643  hibernationCommand = "test";
644  }
645  else if (hm == TDESystemHibernationMethod::Suspend) {
646  hibernationCommand = "suspend";
647  }
648  params << TQT_DBusData::fromString(hibernationCommand);
649  TQT_DBusMessage reply = hardwareControl.sendWithReply("SetHibernationMethod", params);
650  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
651  return;
652  }
653  }
654  }
655  }
656 #endif // WITH_TDEHWLIB_DAEMONS
657 
658 }
659 
660 bool TDERootSystemDevice::setPowerState(TDESystemPowerState::TDESystemPowerState ps) {
661  if ((ps == TDESystemPowerState::Freeze) || (ps == TDESystemPowerState::Standby) ||
662  (ps == TDESystemPowerState::Suspend) || (ps == TDESystemPowerState::Hibernate) ||
663  (ps == TDESystemPowerState::HybridSuspend)) {
664  TQString statenode = "/sys/power/state";
665  TQString disknode = "/sys/power/disk";
666  TQFile statefile( statenode );
667  TQFile diskfile( disknode );
668  if ( statefile.open( IO_WriteOnly ) &&
669  ((ps != TDESystemPowerState::Hibernate && ps != TDESystemPowerState::HybridSuspend) ||
670  diskfile.open( IO_WriteOnly )) ) {
671  TQString powerCommand;
672  if (ps == TDESystemPowerState::Freeze) {
673  powerCommand = "freeze";
674  }
675  else if (ps == TDESystemPowerState::Standby) {
676  powerCommand = "standby";
677  }
678  else if (ps == TDESystemPowerState::Suspend) {
679  powerCommand = "mem";
680  }
681  else if (ps == TDESystemPowerState::Hibernate) {
682  powerCommand = "disk";
683  TQTextStream diskstream( &diskfile );
684  diskstream << "platform";
685  diskfile.close();
686  }
687  else if (ps == TDESystemPowerState::HybridSuspend) {
688  powerCommand = "disk";
689  TQTextStream diskstream( &diskfile );
690  diskstream << "suspend";
691  diskfile.close();
692  }
693  TQTextStream statestream( &statefile );
694  statestream << powerCommand;
695  statefile.close();
696  return true;
697  }
698 
699 #ifdef WITH_LOGINDPOWER
700  {
701  // No support for "freeze" and "standby" in org.freedesktop.login1
702  TQT_DBusConnection dbusConn;
703  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
704  if ( dbusConn.isConnected() ) {
705  TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1",
706  "org.freedesktop.login1.Manager", dbusConn);
707  TQValueList<TQT_DBusData> params;
708  params << TQT_DBusData::fromBool(true);
709  if (logindProxy.canSend()) {
710  if (ps == TDESystemPowerState::Suspend) {
711  TQT_DBusMessage reply = logindProxy.sendWithReply("Suspend", params);
712  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
713  return true;
714  }
715  }
716  else if (ps == TDESystemPowerState::Hibernate) {
717  TQT_DBusMessage reply = logindProxy.sendWithReply("Hibernate", params);
718  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
719  return true;
720  }
721  }
722  else if (ps == TDESystemPowerState::HybridSuspend) {
723  TQT_DBusMessage reply = logindProxy.sendWithReply("HybridSleep", params);
724  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
725  return true;
726  }
727  }
728  }
729  }
730  }
731 #endif // WITH_LOGINDPOWER
732 
733 #ifdef WITH_UPOWER
734  {
735  // No support for "freeze" and "hybrid suspend" in org.freedesktop.UPower
736  TQT_DBusConnection dbusConn;
737  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
738  if ( dbusConn.isConnected() ) {
739  if (ps == TDESystemPowerState::Suspend) {
740  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
741  "org.freedesktop.UPower",
742  "/org/freedesktop/UPower",
743  "org.freedesktop.UPower",
744  "Suspend");
745  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
746  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
747  return true;
748  }
749  }
750  else if (ps == TDESystemPowerState::Hibernate) {
751  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
752  "org.freedesktop.UPower",
753  "/org/freedesktop/UPower",
754  "org.freedesktop.UPower",
755  "Hibernate");
756  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
757  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
758  return true;
759  }
760  }
761  }
762  }
763 #endif // WITH_UPOWER
764 
765 #ifdef WITH_DEVKITPOWER
766  {
767  // No support for "freeze" and "hybrid suspend" in org.freedesktop.DeviceKit.Power
768  TQT_DBusConnection dbusConn;
769  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
770  if ( dbusConn.isConnected() ) {
771  if (ps == TDESystemPowerState::Suspend) {
772  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
773  "org.freedesktop.DeviceKit.Power",
774  "/org/freedesktop/DeviceKit/Power",
775  "org.freedesktop.DeviceKit.Power",
776  "Suspend");
777  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
778  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
779  return true;
780  }
781  }
782  else if (ps == TDESystemPowerState::Hibernate) {
783  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
784  "org.freedesktop.DeviceKit.Power",
785  "/org/freedesktop/DeviceKit/Power",
786  "org.freedesktop.DeviceKit.Power",
787  "Hibernate");
788  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
789  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
790  return true;
791  }
792  }
793  }
794  }
795 #endif // WITH_DEVKITPOWER
796 
797 #ifdef WITH_HAL
798  {
799  // No support for "freeze" in org.freedesktop.Hal
800  TQT_DBusConnection dbusConn;
801  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
802  if ( dbusConn.isConnected() ) {
803  if (ps == TDESystemPowerState::Suspend) {
804  TQT_DBusProxy halPowerManagement(
805  "org.freedesktop.Hal",
806  "/org/freedesktop/Hal/devices/computer",
807  "org.freedesktop.Hal.Device.SystemPowerManagement",
808  dbusConn);
809  TQValueList<TQT_DBusData> params;
810  params << TQT_DBusData::fromInt32(0);
811  TQT_DBusMessage reply = halPowerManagement.sendWithReply("Suspend", params);
812  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
813  return true;
814  }
815  }
816  else if (ps == TDESystemPowerState::Hibernate) {
817  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
818  "org.freedesktop.Hal",
819  "/org/freedesktop/Hal/devices/computer",
820  "org.freedesktop.Hal.Device.SystemPowerManagement",
821  "Hibernate");
822  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
823  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
824  return true;
825  }
826  }
827  else if (ps == TDESystemPowerState::HybridSuspend) {
828  TQT_DBusProxy halPowerManagement(
829  "org.freedesktop.Hal",
830  "/org/freedesktop/Hal/devices/computer",
831  "org.freedesktop.Hal.Device.SystemPowerManagement",
832  dbusConn);
833  TQValueList<TQT_DBusData> params;
834  params << TQT_DBusData::fromInt32(0);
835  TQT_DBusMessage reply = halPowerManagement.sendWithReply("SuspendHybrid", params);
836  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
837  return true;
838  }
839  }
840  }
841  }
842 #endif // WITH_HAL
843 
844 #ifdef WITH_TDEHWLIB_DAEMONS
845  {
846  TQT_DBusConnection dbusConn;
847  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
848  if ( dbusConn.isConnected() ) {
849  if (ps == TDESystemPowerState::Standby) {
850  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
851  "org.trinitydesktop.hardwarecontrol",
852  "/org/trinitydesktop/hardwarecontrol",
853  "org.trinitydesktop.hardwarecontrol.Power",
854  "Standby");
855  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
856  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
857  return true;
858  }
859  }
860  else if (ps == TDESystemPowerState::Freeze) {
861  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
862  "org.trinitydesktop.hardwarecontrol",
863  "/org/trinitydesktop/hardwarecontrol",
864  "org.trinitydesktop.hardwarecontrol.Power",
865  "Freeze");
866  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
867  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
868  return true;
869  }
870  }
871  else if (ps == TDESystemPowerState::Suspend) {
872  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
873  "org.trinitydesktop.hardwarecontrol",
874  "/org/trinitydesktop/hardwarecontrol",
875  "org.trinitydesktop.hardwarecontrol.Power",
876  "Suspend");
877  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
878  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
879  return true;
880  }
881  }
882  else if (ps == TDESystemPowerState::Hibernate) {
883  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
884  "org.trinitydesktop.hardwarecontrol",
885  "/org/trinitydesktop/hardwarecontrol",
886  "org.trinitydesktop.hardwarecontrol.Power",
887  "Hibernate");
888  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
889  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
890  return true;
891  }
892  }
893  else if (ps == TDESystemPowerState::HybridSuspend) {
894  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
895  "org.trinitydesktop.hardwarecontrol",
896  "/org/trinitydesktop/hardwarecontrol",
897  "org.trinitydesktop.hardwarecontrol.Power",
898  "HybridSuspend");
899  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
900  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
901  return true;
902  }
903  }
904  }
905  }
906 #endif // WITH_TDEHWLIB_DAEMONS
907 
908  return false;
909  }
910  else if (ps == TDESystemPowerState::PowerOff) {
911  TDEConfig config("ksmserverrc", true);
912  config.setGroup("General" );
913  if (!config.readBoolEntry( "offerShutdown", true )) {
914  return false;
915  }
916 #ifdef WITH_LOGINDPOWER
917  {
918  TQT_DBusConnection dbusConn;
919  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
920  if ( dbusConn.isConnected() ) {
921  TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1",
922  "org.freedesktop.login1.Manager", dbusConn);
923  TQValueList<TQT_DBusData> params;
924  params << TQT_DBusData::fromBool(true);
925  if (logindProxy.canSend()) {
926  TQT_DBusMessage reply = logindProxy.sendWithReply("PowerOff", params);
927  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
928  return true;
929  }
930  }
931  }
932  }
933 #endif // WITH_LOGINDPOWER
934 #ifdef WITH_CONSOLEKIT
935  {
936  TQT_DBusConnection dbusConn;
937  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
938  if ( dbusConn.isConnected() ) {
939  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
940  "org.freedesktop.ConsoleKit",
941  "/org/freedesktop/ConsoleKit/Manager",
942  "org.freedesktop.ConsoleKit.Manager",
943  "Stop");
944  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
945  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
946  return true;
947  }
948  }
949  }
950 #endif // WITH_CONSOLEKIT
951  // Power down the system using a DCOP command
952  /* As found at http://lists.kde.org/?l=kde-linux&m=115770988603387
953  Logout parameters explanation:
954  First parameter: confirm
955  Obey the user's confirmation setting: -1
956  Don't confirm, shutdown without asking: 0
957  Always confirm, ask even if the user turned it off: 1
958  Second parameter: type
959  Select previous action or the default if it's the first time: -1
960  Only log out: 0
961  Log out and reboot the machine: 1
962  Log out and halt the machine: 2
963  Third parameter: mode
964  Select previous mode or the default if it's the first time: -1
965  Schedule a shutdown (halt or reboot) for the time all active sessions have exited: 0
966  Shut down, if no sessions are active. Otherwise do nothing: 1
967  Force shutdown. Kill any possibly active sessions: 2
968  Pop up a dialog asking the user what to do if sessions are still active: 3
969  */
970  TQByteArray data;
971  TQDataStream arg(data, IO_WriteOnly);
972  arg << (int)0 << (int)2 << (int)2;
973  if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) {
974  return true;
975  }
976  return false;
977  }
978  else if (ps == TDESystemPowerState::Reboot) {
979  TDEConfig config("ksmserverrc", true);
980  config.setGroup("General" );
981  if (!config.readBoolEntry( "offerShutdown", true )) {
982  return false;
983  }
984 #ifdef WITH_LOGINDPOWER
985  {
986  TQT_DBusConnection dbusConn;
987  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
988  if ( dbusConn.isConnected() ) {
989  TQT_DBusProxy logindProxy("org.freedesktop.login1", "/org/freedesktop/login1",
990  "org.freedesktop.login1.Manager", dbusConn);
991  TQValueList<TQT_DBusData> params;
992  params << TQT_DBusData::fromBool(true);
993  if (logindProxy.canSend()) {
994  TQT_DBusMessage reply = logindProxy.sendWithReply("Reboot", params);
995  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
996  return true;
997  }
998  }
999  }
1000  }
1001 #endif // WITH_LOGINDPOWER
1002 #ifdef WITH_CONSOLEKIT
1003  {
1004  TQT_DBusConnection dbusConn;
1005  dbusConn = TQT_DBusConnection::addConnection(TQT_DBusConnection::SystemBus);
1006  if ( dbusConn.isConnected() ) {
1007  TQT_DBusMessage msg = TQT_DBusMessage::methodCall(
1008  "org.freedesktop.ConsoleKit",
1009  "/org/freedesktop/ConsoleKit/Manager",
1010  "org.freedesktop.ConsoleKit.Manager",
1011  "Restart");
1012  TQT_DBusMessage reply = dbusConn.sendWithReply(msg);
1013  if (reply.type() == TQT_DBusMessage::ReplyMessage) {
1014  return true;
1015  }
1016  }
1017  }
1018 #endif // WITH_CONSOLEKIT
1019  // Power down the system using a DCOP command
1020  // See above PowerOff section for logout() parameters explanation
1021  TQByteArray data;
1022  TQDataStream arg(data, IO_WriteOnly);
1023  arg << (int)0 << (int)1 << (int)2;
1024  if ( kapp->dcopClient()->send("ksmserver", "default", "logout(int,int,int)", data) ) {
1025  return true;
1026  }
1027  return false;
1028  }
1029  else if (ps == TDESystemPowerState::Active) {
1030  // Ummm...we're already active...
1031  return true;
1032  }
1033 
1034  return false;
1035 }
1036 
1037 #include "tderootsystemdevice.moc"
TDEConfig
Access KDE Configuration entries.
Definition: tdeconfig.h:43

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.8.13
This website is maintained by Timothy Pearson.