VirtualBox

Changeset 35460 in vbox for trunk/src/VBox/Main/src-server


Ignore:
Timestamp:
Jan 10, 2011 2:24:13 PM (14 years ago)
Author:
vboxsync
Message:

Main/Console+Machine: move PowerDown progress object to VBoxSVC, plus VMTask cleanup

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-server/MachineImpl.cpp

    r35429 r35460  
    55
    66/*
    7  * Copyright (C) 2006-2010 Oracle Corporation
     7 * Copyright (C) 2006-2011 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    1047910479}
    1048010480
    10481 
    1048210481/**
    1048310482 *  @note Locks this object for writing.
     
    1051310512    return S_OK;
    1051410513}
     10514
     10515/**
     10516 *  @note Locks this object for writing.
     10517 */
     10518STDMETHODIMP SessionMachine::BeginPoweringDown(IProgress **aProgress)
     10519{
     10520    LogFlowThisFuncEnter();
     10521
     10522    CheckComArgOutPointerValid(aProgress);
     10523
     10524    AutoCaller autoCaller(this);
     10525    AssertComRCReturn(autoCaller.rc(), autoCaller.rc());
     10526
     10527    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     10528
     10529    AssertReturn(mConsoleTaskData.mLastState == MachineState_Null,
     10530                 E_FAIL);
     10531
     10532    /* create a progress object to track operation completion */
     10533    ComObjPtr<Progress> pProgress;
     10534    pProgress.createObject();
     10535    pProgress->init(getVirtualBox(),
     10536                    static_cast<IMachine *>(this) /* aInitiator */,
     10537                    Bstr(tr("Stopping the virtual machine")).raw(),
     10538                    FALSE /* aCancelable */);
     10539
     10540    /* fill in the console task data */
     10541    mConsoleTaskData.mLastState = mData->mMachineState;
     10542    mConsoleTaskData.mProgress = pProgress;
     10543
     10544    /* set the state to Stopping (this is expected by Console::PowerDown()) */
     10545    setMachineState(MachineState_Stopping);
     10546
     10547    pProgress.queryInterfaceTo(aProgress);
     10548
     10549    return S_OK;
     10550}
     10551
     10552/**
     10553 *  @note Locks this object for writing.
     10554 */
     10555STDMETHODIMP SessionMachine::EndPoweringDown(LONG iResult, IN_BSTR aErrMsg)
     10556{
     10557    LogFlowThisFuncEnter();
     10558
     10559    AutoCaller autoCaller(this);
     10560    AssertComRCReturn(autoCaller.rc(), autoCaller.rc());
     10561
     10562    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     10563
     10564    AssertReturn(    (   (SUCCEEDED(iResult) && mData->mMachineState == MachineState_PoweredOff)
     10565                      || (FAILED(iResult) && mData->mMachineState == MachineState_Stopping))
     10566                  && mConsoleTaskData.mLastState != MachineState_Null,
     10567                 E_FAIL);
     10568
     10569    /*
     10570     * On failure, set the state to the state we had when BeginPoweringDown()
     10571     * was called (this is expected by Console::PowerDown() and the associated
     10572     * task). On success the VM process already changed the state to
     10573     * MachineState_PoweredOff, so no need to do anything.
     10574     */
     10575    if (FAILED(iResult))
     10576        setMachineState(mConsoleTaskData.mLastState);
     10577
     10578    /* notify the progress object about operation completion */
     10579    Assert(mConsoleTaskData.mProgress);
     10580    if (SUCCEEDED(iResult))
     10581        mConsoleTaskData.mProgress->notifyComplete(S_OK);
     10582    else
     10583    {
     10584        Utf8Str strErrMsg(aErrMsg);
     10585        if (strErrMsg.length())
     10586            mConsoleTaskData.mProgress->notifyComplete(iResult,
     10587                                                       COM_IIDOF(ISession),
     10588                                                       getComponentName(),
     10589                                                       strErrMsg.c_str());
     10590        else
     10591            mConsoleTaskData.mProgress->notifyComplete(iResult);
     10592    }
     10593
     10594    /* clear out the temporary saved state data */
     10595    mConsoleTaskData.mLastState = MachineState_Null;
     10596    mConsoleTaskData.mProgress.setNull();
     10597
     10598    LogFlowThisFuncLeave();
     10599    return S_OK;
     10600}
     10601
    1051510602
    1051610603/**
     
    1077910866    }
    1078010867
    10781     /* fill in the snapshot data */
     10868    /* fill in the console task data */
    1078210869    mConsoleTaskData.mLastState = mData->mMachineState;
    1078310870    mConsoleTaskData.mStateFilePath = stateFilePath;
     
    1154111628        if (aErrMsg.length())
    1154211629            mConsoleTaskData.mProgress->notifyComplete(aRc,
    11543                                                     COM_IIDOF(ISession),
    11544                                                     getComponentName(),
    11545                                                     aErrMsg.c_str());
     11630                                                       COM_IIDOF(ISession),
     11631                                                       getComponentName(),
     11632                                                       aErrMsg.c_str());
    1154611633        else
    1154711634            mConsoleTaskData.mProgress->notifyComplete(aRc);
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