VBoxManageSnapshot.cpp revision 64c0714fbcb83dd46eae7899405379b8b002d2ed
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/* $Id$ */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/** @file
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * VBoxManage - The 'snapshot' command.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/*
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Copyright (C) 2006-2009 Sun Microsystems, Inc.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * available from http://www.virtualbox.org. This file is free software;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * you can redistribute it and/or modify it under the terms of the GNU
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * General Public License (GPL) as published by the Free Software
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * additional information or have any questions.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifndef VBOX_ONLY_DOCS
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync/*******************************************************************************
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync* Header Files *
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync*******************************************************************************/
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <VBox/com/com.h>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <VBox/com/string.h>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <VBox/com/ErrorInfo.h>
c8bcebedf264bc1287bcce50bdf66d08e28a88dcvboxsync#include <VBox/com/errorprint2.h>
5debbbcc37114f1dbecaecfc66c81ea2fbda6140vboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <VBox/com/VirtualBox.h>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <iprt/stream.h>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <iprt/getopt.h>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync#include "VBoxManage.h"
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsyncusing namespace com;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsyncint handleSnapshot(HandlerArg *a)
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync{
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync HRESULT rc;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* we need at least a VM and a command */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (a->argc < 2)
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync return errorSyntax(USAGE_SNAPSHOT, "Not enough parameters");
1f6b1f68eb26f8af1f9a4b5ffd00df66ad7af1devboxsync
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* the first argument must be the VM */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync ComPtr<IMachine> machine;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* assume it's a UUID */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync if (FAILED(rc) || !machine)
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync {
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync /* must be a name */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (!machine)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return 1;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Guid guid;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync machine->COMGETTER(Id)(guid.asOutParam());
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync do
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* we have to open a session for this task. First try an existing session */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = a->virtualBox->OpenExistingSession(a->session, guid);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (FAILED(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync CHECK_ERROR_BREAK(a->virtualBox, OpenSession(a->session, guid));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync ComPtr<IConsole> console;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync CHECK_ERROR_BREAK(a->session, COMGETTER(Console)(console.asOutParam()));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* switch based on the command */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (strcmp(a->argv[1], "take") == 0)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* there must be a name */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (a->argc < 3)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync errorSyntax(USAGE_SNAPSHOT, "Missing snapshot name");
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = E_FAIL;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync break;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Bstr name(a->argv[2]);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if ((a->argc > 3) && ((a->argc != 5) || (strcmp(a->argv[3], "-desc") != 0)))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync errorSyntax(USAGE_SNAPSHOT, "Incorrect description format");
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = E_FAIL;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync break;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Bstr desc;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (a->argc == 5)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync desc = a->argv[4];
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync ComPtr<IProgress> progress;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync CHECK_ERROR_BREAK(console, TakeSnapshot(name, desc, progress.asOutParam()));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync showProgress(progress);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync progress->COMGETTER(ResultCode)(&rc);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (FAILED(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync com::ProgressErrorInfo info(progress);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (info.isBasicAvailable())
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTPrintf("Error: failed to take snapshot. Error message: %lS\n", info.getText().raw());
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTPrintf("Error: failed to take snapshot. No error message available!\n");
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else if (strcmp(a->argv[1], "discard") == 0)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* exactly one parameter: snapshot name */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (a->argc != 3)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync errorSyntax(USAGE_SNAPSHOT, "Expecting snapshot name only");
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = E_FAIL;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync break;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync ComPtr<ISnapshot> snapshot;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* assume it's a UUID */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Guid guid(a->argv[2]);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (!guid.isEmpty())
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync CHECK_ERROR_BREAK(machine, GetSnapshot(guid, snapshot.asOutParam()));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* then it must be a name */
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(a->argv[2]), snapshot.asOutParam()));
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync }
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync snapshot->COMGETTER(Id)(guid.asOutParam());
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync ComPtr<IProgress> progress;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync CHECK_ERROR_BREAK(console, DiscardSnapshot(guid, progress.asOutParam()));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync showProgress(progress);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync progress->COMGETTER(ResultCode)(&rc);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (FAILED(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync com::ProgressErrorInfo info(progress);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (info.isBasicAvailable())
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTPrintf("Error: failed to discard snapshot. Error message: %lS\n", info.getText().raw());
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync else
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTPrintf("Error: failed to discard snapshot. No error message available!\n");
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else if (strcmp(a->argv[1], "discardcurrent") == 0)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if ( (a->argc != 3)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync || ( (strcmp(a->argv[2], "-state") != 0)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync && (strcmp(a->argv[2], "-all") != 0)))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(a->argv[2]).raw());
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = E_FAIL;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync break;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync bool fAll = false;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync if (strcmp(a->argv[2], "-all") == 0)
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync fAll = true;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync ComPtr<IProgress> progress;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (fAll)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync CHECK_ERROR_BREAK(console, DiscardCurrentSnapshotAndState(progress.asOutParam()));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync CHECK_ERROR_BREAK(console, DiscardCurrentState(progress.asOutParam()));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync showProgress(progress);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync progress->COMGETTER(ResultCode)(&rc);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (FAILED(rc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync com::ProgressErrorInfo info(progress);
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync if (info.isBasicAvailable())
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync RTPrintf("Error: failed to discard. Error message: %lS\n", info.getText().raw());
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTPrintf("Error: failed to discard. No error message available!\n");
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else if (strcmp(a->argv[1], "edit") == 0)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (a->argc < 3)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync errorSyntax(USAGE_SNAPSHOT, "Missing snapshot name");
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = E_FAIL;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync break;
e7e60b177e688900656c04404c5123f1dfa1d02cvboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync ComPtr<ISnapshot> snapshot;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (strcmp(a->argv[2], "-current") == 0)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync CHECK_ERROR_BREAK(machine, COMGETTER(CurrentSnapshot)(snapshot.asOutParam()));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync {
9f9eff04f209bd905529ee3b76076e55568db917vboxsync /* assume it's a UUID */
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync Guid guid(a->argv[2]);
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync if (!guid.isEmpty())
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync {
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync CHECK_ERROR_BREAK(machine, GetSnapshot(guid, snapshot.asOutParam()));
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync }
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync else
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync {
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync /* then it must be a name */
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(a->argv[2]), snapshot.asOutParam()));
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync }
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync }
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync /* parse options */
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync for (int i = 3; i < a->argc; i++)
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync {
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync if (strcmp(a->argv[i], "-newname") == 0)
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync {
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync if (a->argc <= i + 1)
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync {
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync errorArgument("Missing argument to '%s'", a->argv[i]);
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync rc = E_FAIL;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync break;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync }
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync i++;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync snapshot->COMSETTER(Name)(Bstr(a->argv[i]));
9f9eff04f209bd905529ee3b76076e55568db917vboxsync }
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync else if (strcmp(a->argv[i], "-newdesc") == 0)
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync {
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync if (a->argc <= i + 1)
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync {
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync errorArgument("Missing argument to '%s'", a->argv[i]);
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync rc = E_FAIL;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync break;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync }
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync i++;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync snapshot->COMSETTER(Description)(Bstr(a->argv[i]));
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync }
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync else
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync {
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync rc = E_FAIL;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync break;
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync }
a2d53f020c57ede4a469a06d8ef8f735c7a46596vboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else if (strcmp(a->argv[1], "showvminfo") == 0)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* exactly one parameter: snapshot name */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (a->argc != 3)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync errorSyntax(USAGE_SNAPSHOT, "Expecting snapshot name only");
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = E_FAIL;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync break;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync ComPtr<ISnapshot> snapshot;
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* assume it's a UUID */
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync Guid guid(a->argv[2]);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (!guid.isEmpty())
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c0e6e6c131cfdaeaeaea598603f6ef6ab10e781vboxsync CHECK_ERROR_BREAK(machine, GetSnapshot(guid, snapshot.asOutParam()));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* then it must be a name */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(a->argv[2]), snapshot.asOutParam()));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* get the machine of the given snapshot */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync ComPtr<IMachine> machine;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync snapshot->COMGETTER(Machine)(machine.asOutParam());
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync showVMInfo(a->virtualBox, machine, VMINFO_NONE, console);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(a->argv[1]).raw());
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = E_FAIL;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync } while (0);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync a->session->Close();
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return SUCCEEDED(rc) ? 0 : 1;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif /* !VBOX_ONLY_DOCS */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync