00001 #include "config.h"
00002
00003 #include <QCoreApplication>
00004 #if CONFIG_QTDBUS
00005 #include <QtDBus>
00006 #include <QDBusInterface>
00007 #endif
00008
00009 #include "exitprompt.h"
00010 #include "mythcontext.h"
00011 #include "mythdialogbox.h"
00012 #include "mythmainwindow.h"
00013 #include "mythscreenstack.h"
00014 #include "mythsystem.h"
00015 #include "mythlogging.h"
00016 #include "exitcodes.h"
00017
00018 void ExitPrompter::quit()
00019 {
00020 qApp->exit();
00021 }
00022
00023 static bool DBusHalt(void)
00024 {
00025 #if CONFIG_QTDBUS
00026 QDBusInterface kde("org.kde.ksmserver",
00027 "/KSMServer",
00028 "org.kde.KSMServerInterface");
00029 QDBusInterface gnome("org.gnome.SessionManager",
00030 "/org/gnome/SessionManager",
00031 "org.gnome.SessionManager");
00032 QDBusInterface consolekit("org.freedesktop.ConsoleKit",
00033 "/org/freedesktop/ConsoleKit/Manager",
00034 "org.freedesktop.ConsoleKit.Manager",
00035 QDBusConnection::systemBus());
00036 QDBusInterface hal("org.freedesktop.Hal",
00037 "/org/freedesktop/Hal/devices/computer",
00038 "org.freedesktop.Hal.Device.SystemPowerManagement",
00039 QDBusConnection::systemBus());
00040
00041 QDBusReply<void> void_reply = kde.call("logout", 0, 2, 2);
00042 QDBusReply<bool> bool_reply;
00043 QDBusReply<int> int_reply;
00044
00045 if (!void_reply.isValid())
00046 {
00047 bool_reply = gnome.call("CanShutdown");
00048 if (bool_reply.isValid() && bool_reply.value() == 1)
00049 void_reply = gnome.call("RequestShutdown");
00050 }
00051 if (!void_reply.isValid())
00052 {
00053 bool_reply = consolekit.call("CanStop");
00054 if (bool_reply.isValid() && bool_reply.value() == 1)
00055 void_reply = consolekit.call("Stop");
00056 }
00057 if (!void_reply.isValid())
00058 int_reply = hal.call("Shutdown");
00059
00060 return void_reply.isValid() || int_reply.isValid();
00061 #endif
00062 return false;
00063 }
00064
00065 void ExitPrompter::halt()
00066 {
00067 QString halt_cmd = gCoreContext->GetSetting("HaltCommand","");
00068 int ret = -1;
00069
00070 if (!halt_cmd.isEmpty())
00071 {
00072 ret = myth_system(halt_cmd);
00073 if (ret != GENERIC_EXIT_OK)
00074 LOG(VB_GENERAL, LOG_ERR,
00075 "User defined HaltCommand failed, falling back to "
00076 "alternative methods.");
00077 }
00078
00079
00080 if (ret != GENERIC_EXIT_OK && !DBusHalt())
00081 myth_system("sudo /sbin/halt -p");
00082 }
00083
00084 static bool DBusReboot(void)
00085 {
00086 #if CONFIG_QTDBUS
00087 QDBusInterface kde("org.kde.ksmserver",
00088 "/KSMServer",
00089 "org.kde.KSMServerInterface");
00090 QDBusInterface gnome("org.gnome.SessionManager",
00091 "/org/gnome/SessionManager",
00092 "org.gnome.SessionManager");
00093 QDBusInterface consolekit("org.freedesktop.ConsoleKit",
00094 "/org/freedesktop/ConsoleKit/Manager",
00095 "org.freedesktop.ConsoleKit.Manager",
00096 QDBusConnection::systemBus());
00097 QDBusInterface hal("org.freedesktop.Hal",
00098 "/org/freedesktop/Hal/devices/computer",
00099 "org.freedesktop.Hal.Device.SystemPowerManagement",
00100 QDBusConnection::systemBus());
00101
00102 QDBusReply<void> void_reply = kde.call("logout", 0, 1, 2);
00103 QDBusReply<bool> bool_reply;
00104 QDBusReply<int> int_reply;
00105
00106 if (!void_reply.isValid())
00107 {
00108 bool_reply = gnome.call("CanShutdown");
00109 if (bool_reply.isValid() && bool_reply.value() == 1)
00110 void_reply=gnome.call("RequestReboot");
00111 }
00112 if (!void_reply.isValid())
00113 {
00114 bool_reply = consolekit.call("CanRestart");
00115 if (bool_reply.isValid() && bool_reply.value() == 1)
00116 void_reply = consolekit.call("Restart");
00117 }
00118 if (!void_reply.isValid())
00119 int_reply = hal.call("Reboot");
00120
00121 return void_reply.isValid() || int_reply.isValid();
00122 #endif
00123 return false;
00124 }
00125
00126 void ExitPrompter::reboot()
00127 {
00128 QString reboot_cmd = gCoreContext->GetSetting("RebootCommand","");
00129 int ret = -1;
00130
00131 if (!reboot_cmd.isEmpty())
00132 {
00133 ret = myth_system(reboot_cmd);
00134 if (ret != GENERIC_EXIT_OK)
00135 LOG(VB_GENERAL, LOG_ERR,
00136 "User defined RebootCommand failed, falling back to "
00137 "alternative methods.");
00138 }
00139
00140
00141 if (ret != GENERIC_EXIT_OK && !DBusReboot())
00142 myth_system("sudo /sbin/reboot");
00143 }
00144
00145 void ExitPrompter::handleExit()
00146 {
00147
00148
00149 gContext->SetDisableEventPopup(true);
00150
00151
00152 bool frontendOnly = gCoreContext->IsFrontendOnly();
00153
00154
00155 gContext->SetDisableEventPopup(false);
00156
00157
00158
00159 bool allowExit = false;
00160 bool allowReboot = false;
00161 bool allowShutdown = false;
00162
00163 switch (gCoreContext->GetNumSetting("OverrideExitMenu", 0))
00164 {
00165 case 0:
00166 allowExit = true;
00167 if (frontendOnly)
00168 allowShutdown = true;
00169 break;
00170 case 1:
00171 allowExit = true;
00172 break;
00173 case 2:
00174 allowExit = true;
00175 allowShutdown = true;
00176 break;
00177 case 3:
00178 allowExit = true;
00179 allowReboot = true;
00180 allowShutdown = true;
00181 break;
00182 case 4:
00183 allowShutdown = true;
00184 break;
00185 case 5:
00186 allowReboot = true;
00187 break;
00188 case 6:
00189 allowReboot = true;
00190 allowShutdown = true;
00191 break;
00192 }
00193
00194 MythScreenStack *ss = GetMythMainWindow()->GetStack("popup stack");
00195 MythDialogBox *dlg = new MythDialogBox(
00196 tr("Do you really want to exit MythTV?"), ss, "exit prompt");
00197
00198 if (!dlg->Create())
00199 {
00200 LOG(VB_GENERAL, LOG_ERR, "Can't create Exit Prompt dialog?");
00201 delete dlg;
00202 quit();
00203 }
00204
00205 dlg->AddButton(tr("No"));
00206 if (allowExit)
00207 dlg->AddButton(QObject::tr("Yes, Exit now"), SLOT(quit()));
00208 if (allowReboot)
00209 dlg->AddButton(QObject::tr("Yes, Exit and Reboot"), SLOT(reboot()));
00210 if (allowShutdown)
00211 dlg->AddButton(QObject::tr("Yes, Exit and Shutdown"), SLOT(halt()));
00212
00213
00214 dlg->SetReturnEvent(this, QString());
00215
00216 ss->AddScreen(dlg);
00217 }