VirtualBox

Changeset 26892 in vbox for trunk/src


Ignore:
Timestamp:
Feb 28, 2010 5:41:34 PM (15 years ago)
Author:
vboxsync
Message:

FE/Qt4: New running VM core: close process update.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp

    r26890 r26892  
    130130void UIMachineWindow::closeEvent(QCloseEvent *pEvent)
    131131{
    132     static const char *pstrSave = "save";
    133     static const char *pstrShutdown = "shutdown";
    134     static const char *pstrPowerOff = "powerOff";
    135     static const char *pstrDiscardCurState = "discardCurState";
    136 
    137     if (!machineWindow())
    138     {
    139         pEvent->accept();
    140         return;
    141     }
    142 
    143132    switch (uisession()->machineState())
    144133    {
    145         case KMachineState_PoweredOff:
    146         case KMachineState_Saved:
    147         case KMachineState_Teleported:
    148         case KMachineState_Aborted:
    149             /* The machine has been already powered off or saved or aborted -- close the window immediately. */
    150             pEvent->accept();
    151             break;
    152 
    153         default:
    154             /* The machine is in some temporary state like Saving or Stopping.
    155              * Ignore the close event. When it is Stopping, it will be soon closed anyway from sltUpdatmachineState().
    156              * In all other cases, an appropriate progress dialog will be shown within a few seconds. */
    157             pEvent->ignore();
    158             break;
    159 
    160         case KMachineState_Teleporting: /** @todo Live Migration: Test closing a VM that's being teleported or snapshotted. */
    161         case KMachineState_LiveSnapshotting:
    162134        case KMachineState_Running:
    163135        case KMachineState_Paused:
    164         case KMachineState_TeleportingPausedVM: /** @todo Live Migration: Check out this. */
    165136        case KMachineState_Stuck:
    166             /* Start with ignoring the close event */
     137        case KMachineState_LiveSnapshotting:
     138        case KMachineState_Teleporting: // TODO: Test this!
     139        case KMachineState_TeleportingPausedVM: // TODO: Test this!
     140        {
     141            /* Ignoring close event initially: */
    167142            pEvent->ignore();
    168143
    169             bool isACPIEnabled = session().GetConsole().GetGuestEnteredACPIMode();
    170 
    171144            bool success = true;
    172145
    173             bool wasPaused = uisession()->isPaused() || uisession()->machineState() == KMachineState_Stuck;
    174             if (!wasPaused)
     146            bool fWasPaused = uisession()->isPaused() || uisession()->machineState() == KMachineState_Stuck;
     147            if (!fWasPaused)
    175148            {
    176149                /* Suspend the VM and ignore the close event if failed to do so.
    177                  * pause() will show the error message to the user. */
     150                 * pause() will show the error message to the user: */
    178151                success = uisession()->pause();
    179152            }
     
    183156                success = false;
    184157
     158                /* Get the machine: */
    185159                CMachine machine = session().GetMachine();
     160
     161                /* Get the ACPI status: */
     162                bool isACPIEnabled = session().GetConsole().GetGuestEnteredACPIMode();
     163
     164                /* Prepare close dialog: */
    186165                VBoxCloseVMDlg dlg(machineWindow());
    187166                QString typeId = machine.GetOSTypeId();
    188167                dlg.pmIcon->setPixmap(vboxGlobal().vmGuestOSTypeIcon(typeId));
    189168
    190                 /* Make the Discard checkbox invisible if there are no snapshots */
     169                /* Make the discard checkbox invisible if there are no snapshots: */
    191170                dlg.mCbDiscardCurState->setVisible(machine.GetSnapshotCount() > 0);
    192171                if (!machine.GetCurrentSnapshot().isNull())
    193172                    dlg.mCbDiscardCurState->setText(dlg.mCbDiscardCurState->text().arg(machine.GetCurrentSnapshot().GetName()));
    194173
     174                /* Close choice string tags: */
     175                QString strSave("save");
     176                QString strShutdown("shutdown");
     177                QString strPowerOff("powerOff");
     178                QString strDiscardCurState("discardCurState");
     179
    195180                if (uisession()->machineState() != KMachineState_Stuck)
    196181                {
    197                     /* Read the last user's choice for the given VM */
     182                    /* Read the last user's choice for the given VM: */
    198183                    QStringList lastAction = machine.GetExtraData(VBoxDefs::GUI_LastCloseAction).split(',');
    199184                    AssertWrapperOk(machine);
    200                     if (lastAction[0] == pstrSave)
     185                    if (lastAction[0] == strSave)
    201186                    {
    202187                        dlg.mRbShutdown->setEnabled(isACPIEnabled);
     
    204189                        dlg.mRbSave->setFocus();
    205190                    }
    206                     else if (lastAction[0] == pstrPowerOff || !isACPIEnabled)
     191                    else if (lastAction[0] == strPowerOff || !isACPIEnabled)
    207192                    {
    208193                        dlg.mRbShutdown->setEnabled(isACPIEnabled);
     
    210195                        dlg.mRbPowerOff->setFocus();
    211196                    }
    212                     else /* The default is ACPI Shutdown */
     197                    else /* The default is ACPI Shutdown: */
    213198                    {
    214199                        dlg.mRbShutdown->setChecked(true);
    215200                        dlg.mRbShutdown->setFocus();
    216201                    }
    217                     dlg.mCbDiscardCurState->setChecked(lastAction.count() > 1 && lastAction [1] == pstrDiscardCurState);
     202                    dlg.mCbDiscardCurState->setChecked(lastAction.count() > 1 && lastAction [1] == strDiscardCurState);
    218203                }
    219204                else
    220205                {
    221                     /* The stuck VM can only be powered off; disable anything else and choose PowerOff */
     206                    /* The stuck VM can only be powered off; disable anything else and choose PowerOff: */
    222207                    dlg.mRbSave->setEnabled(false);
    223208                    dlg.mRbShutdown->setEnabled(false);
     
    225210                }
    226211
    227                 bool wasShutdown = false;
    228 
     212                bool fWasShutdown = false;
     213
     214                /* If close dialog accepted: */
    229215                if (dlg.exec() == QDialog::Accepted)
    230216                {
    231                     /* Disable auto closure because we want to have a chance to show
    232                      * the error dialog on save state / power off failure. */
    233                     machineLogic()->setPreventAutoClose(true);
    234 
    235217                    CConsole console = session().GetConsole();
    236218
     
    241223                        if (console.isOk())
    242224                        {
    243                             /* Show the "VM saving" progress dialog */
     225                            /* Show the "VM saving" progress dialog: */
    244226                            vboxProblem().showModalProgressDialog(progress, machine.GetName(), 0, 0);
    245227                            if (progress.GetResultCode() != 0)
     
    253235                    else if (dlg.mRbShutdown->isChecked())
    254236                    {
    255                         /* Unpause the VM to let it grab the ACPI shutdown event */
     237                        /* Unpause the VM to let it grab the ACPI shutdown event: */
    256238                        uisession()->unpause();
    257                         /* Prevent the subsequent unpause request */
    258                         wasPaused = true;
    259                         /* Signal ACPI shutdown (if there is no ACPI device, the
    260                          * operation will fail) */
     239                        /* Prevent the subsequent unpause request: */
     240                        fWasPaused = true;
     241                        /* Signal ACPI shutdown (if there is no ACPI device, the operation will fail): */
    261242                        console.PowerButton();
    262                         wasShutdown = console.isOk();
    263                         if (!wasShutdown)
     243                        fWasShutdown = console.isOk();
     244                        if (!fWasShutdown)
    264245                            vboxProblem().cannotACPIShutdownMachine(console);
    265246                        /* Success is always false because we never accept the close
    266                          * window action when doing ACPI shutdown */
     247                         * window action when doing ACPI shutdown: */
    267248                        success = false;
    268249                    }
     
    273254                        if (console.isOk())
    274255                        {
    275                             /* Show the power down progress dialog */
     256                            /* Show the power down progress dialog: */
    276257                            vboxProblem().showModalProgressDialog(progress, machine.GetName(), 0);
    277258                            if (progress.GetResultCode() != 0)
     
    285266                        if (success)
    286267                        {
    287                             /* Note: leave success = true even if we fail to
    288                              * discard the current state later -- the console window
    289                              * will closed anyway */
    290 
    291                             /* Discard the current state if requested */
     268                            /* Discard the current state if requested: */
    292269                            if (dlg.mCbDiscardCurState->isChecked() && dlg.mCbDiscardCurState->isVisibleTo(&dlg))
    293270                            {
     
    296273                                if (console.isOk())
    297274                                {
    298                                     /* Show the progress dialog */
     275                                    /* Show the progress dialog: */
    299276                                    vboxProblem().showModalProgressDialog(progress, machine.GetName(), 0);
    300277                                    if (progress.GetResultCode() != 0)
     
    309286                    if (success)
    310287                    {
    311                         /* Accept the close action on success */
     288                        /* Accept the close action on success: */
    312289                        pEvent->accept();
    313290                    }
    314291
    315                     if (success || wasShutdown)
    316                     {
    317                         /* Read the last user's choice for the given VM */
     292                    if (success || fWasShutdown)
     293                    {
     294                        /* Read the last user's choice for the given VM: */
    318295                        QStringList prevAction = machine.GetExtraData(VBoxDefs::GUI_LastCloseAction).split(',');
    319                         /* Memorize the last user's choice for the given VM */
    320                         QString lastAction = pstrPowerOff;
     296                        /* Memorize the last user's choice for the given VM: */
     297                        QString lastAction = strPowerOff;
    321298                        if (dlg.mRbSave->isChecked())
    322                             lastAction = pstrSave;
     299                            lastAction = strSave;
    323300                        else if (dlg.mRbShutdown->isChecked() ||
    324                                  (dlg.mRbPowerOff->isChecked() && prevAction [0] == pstrShutdown && !isACPIEnabled))
    325                             lastAction = pstrShutdown;
     301                                 (dlg.mRbPowerOff->isChecked() && prevAction [0] == strShutdown && !isACPIEnabled))
     302                            lastAction = strShutdown;
    326303                        else if (dlg.mRbPowerOff->isChecked())
    327                             lastAction = pstrPowerOff;
     304                            lastAction = strPowerOff;
    328305                        else
    329306                            AssertFailed();
    330307                        if (dlg.mCbDiscardCurState->isChecked())
    331                             (lastAction += ",") += pstrDiscardCurState;
     308                            (lastAction += ",") += strDiscardCurState;
    332309                        machine.SetExtraData (VBoxDefs::GUI_LastCloseAction, lastAction);
    333310                        AssertWrapperOk(machine);
     
    335312                }
    336313            }
    337 
    338             machineLogic()->setPreventAutoClose(false);
    339314
    340315            if (uisession()->machineState() == KMachineState_PoweredOff ||
     
    344319            {
    345320                /* The machine has been stopped while showing the Close or the Pause
    346                  * failure dialog -- accept the close event immediately. */
     321                 * failure dialog - accept the close event immediately: */
    347322                pEvent->accept();
    348323            }
     
    351326                if (!success)
    352327                {
    353                     /* Restore the running state if needed */
    354                     if (!wasPaused && uisession()->machineState() == KMachineState_Paused)
     328                    /* Restore the running state if needed: */
     329                    if (!fWasPaused && uisession()->machineState() == KMachineState_Paused)
    355330                        uisession()->unpause();
    356331                }
    357332            }
    358333            break;
     334        }
     335
     336#if 0 // TODO: Check if all those states processing is really needed:
     337        case KMachineState_PoweredOff:
     338        case KMachineState_Saved:
     339        case KMachineState_Teleported:
     340        case KMachineState_Aborted:
     341        {
     342            /* The machine has been already powered off or saved or aborted - close the window immediately: */
     343            pEvent->accept();
     344            break;
     345        }
     346#endif
     347
     348        default:
     349        {
     350            /* The machine is in some temporary state like Saving or Stopping.
     351             * Ignore the close event. It will be processed later if something will be failed: */
     352            pEvent->ignore();
     353            break;
     354        }
    359355    }
    360356
     357    /* Postprocess event if accepted: */
    361358    if (pEvent->isAccepted())
    362359    {
     
    371368#endif
    372369
    373         /* Make sure all events are delievered */
    374         qApp->processEvents();
    375 
    376         /* Notify all the top-level dialogs about closing */
     370        /* Notify all the top-level child dialogs about closing: */
    377371        // TODO: Notify about closing!
    378372        //emit closing();
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette