mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 12:30:32 +00:00
240 lines
7.1 KiB
C#
240 lines
7.1 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using Interop.VixCOM;
|
|
using System.IO;
|
|
|
|
namespace Vestris.VMWareLib
|
|
{
|
|
/// <summary>
|
|
/// A collection of snapshots at any snapshot level.
|
|
/// </summary>
|
|
public class VMWareSnapshotCollection : IEnumerable<VMWareSnapshot>, IDisposable
|
|
{
|
|
/// <summary>
|
|
/// Virtual machine handle.
|
|
/// </summary>
|
|
protected IVM2 _vm = null;
|
|
/// <summary>
|
|
/// Internal list of snapshots.
|
|
/// </summary>
|
|
protected List<VMWareSnapshot> _snapshots = null;
|
|
private VMWareSnapshot _parent = null;
|
|
|
|
/// <summary>
|
|
/// Snapshot collection constructor.
|
|
/// </summary>
|
|
/// <param name="vm">Virtual machine.</param>
|
|
/// <param name="parent">Snapshot parent.</param>
|
|
public VMWareSnapshotCollection(IVM2 vm, VMWareSnapshot parent)
|
|
{
|
|
_vm = vm;
|
|
_parent = parent;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The list of snapshots.
|
|
/// </summary>
|
|
protected virtual List<VMWareSnapshot> Snapshots
|
|
{
|
|
get
|
|
{
|
|
if (_snapshots == null)
|
|
{
|
|
_snapshots = new List<VMWareSnapshot>();
|
|
}
|
|
return _snapshots;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Find a snapshot.
|
|
/// </summary>
|
|
/// <param name="pathToSnapshot">Path to a snapshot.</param>
|
|
/// <returns>A snapshot, null if not found.</returns>
|
|
public VMWareSnapshot FindSnapshot(string pathToSnapshot)
|
|
{
|
|
string[] paths = pathToSnapshot.Split("\\".ToCharArray(), 2);
|
|
|
|
foreach (VMWareSnapshot snapshot in this)
|
|
{
|
|
// last snapshot in the path
|
|
if (snapshot.DisplayName == paths[0])
|
|
{
|
|
return (paths.Length == 1)
|
|
? snapshot
|
|
: snapshot.ChildSnapshots.FindSnapshot(paths[1]);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Find a snapshot by name. Unlike GetSnapshotByName this function
|
|
/// doesn't throw an exception when there're two snapshots of the same name, it returns
|
|
/// the first snapshot found.
|
|
/// </summary>
|
|
/// <param name="name">Name of a snapshot.</param>
|
|
/// <returns>The first snapshot that matches the name, null if not found.</returns>
|
|
public VMWareSnapshot FindSnapshotByName(string name)
|
|
{
|
|
foreach (VMWareSnapshot snapshot in this)
|
|
{
|
|
if (snapshot.DisplayName == name)
|
|
{
|
|
return snapshot;
|
|
}
|
|
|
|
VMWareSnapshot childSnapshot = snapshot.ChildSnapshots.FindSnapshotByName(name);
|
|
if (childSnapshot != null)
|
|
{
|
|
return childSnapshot;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Find all snapshots by name. This can return multiple snapshots
|
|
/// that have the same name.
|
|
/// </summary>
|
|
/// <param name="name">Name of a snapshot.</param>
|
|
/// <returns>The first snapshot that matches the name, null if not found.</returns>
|
|
public IEnumerable<VMWareSnapshot> FindSnapshotsByName(string name)
|
|
{
|
|
List<VMWareSnapshot> snapshots = new List<VMWareSnapshot>();
|
|
|
|
foreach (VMWareSnapshot snapshot in this)
|
|
{
|
|
if (snapshot.DisplayName == name)
|
|
{
|
|
snapshots.Add(snapshot);
|
|
}
|
|
|
|
snapshots.AddRange(snapshot.ChildSnapshots.FindSnapshotsByName(name));
|
|
}
|
|
|
|
return snapshots;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Copy to an array of VMWareSnapshots.
|
|
/// </summary>
|
|
/// <param name="array">Target array.</param>
|
|
/// <param name="arrayIndex">Array index.</param>
|
|
public void CopyTo(VMWareSnapshot[] array, int arrayIndex)
|
|
{
|
|
Snapshots.CopyTo(array, arrayIndex);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns true if this virtual machine has the snapshot specified.
|
|
/// </summary>
|
|
/// <param name="item">Snapshot.</param>
|
|
/// <returns>True if the virtual machine contains the specified snapshot.</returns>
|
|
public bool Contains(VMWareSnapshot item)
|
|
{
|
|
return Snapshots.Contains(item);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Number of snapshots.
|
|
/// </summary>
|
|
public int Count
|
|
{
|
|
get
|
|
{
|
|
return Snapshots.Count;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns true if the collection is read-only.
|
|
/// A collection of snapshots is never read-only.
|
|
/// </summary>
|
|
public bool IsReadOnly
|
|
{
|
|
get
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// A snapshot collection enumerator.
|
|
/// </summary>
|
|
/// <returns>Snapshots enumerator.</returns>
|
|
IEnumerator<VMWareSnapshot> IEnumerable<VMWareSnapshot>.GetEnumerator()
|
|
{
|
|
return Snapshots.GetEnumerator();
|
|
}
|
|
|
|
/// <summary>
|
|
/// A snapshot collection enumerator.
|
|
/// </summary>
|
|
/// <returns>Snapshots enumerator.</returns>
|
|
IEnumerator IEnumerable.GetEnumerator()
|
|
{
|
|
return Snapshots.GetEnumerator();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Add a snapshot to the list.
|
|
/// </summary>
|
|
/// <param name="snapshot">Snapshot to add.</param>
|
|
public void Add(VMWareSnapshot snapshot)
|
|
{
|
|
if (snapshot.Parent != null && snapshot.Parent != _parent)
|
|
{
|
|
throw new InvalidOperationException("Snapshot already belongs to another collection.");
|
|
}
|
|
|
|
Snapshots.Add(snapshot);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Remove a snapshot from this collection, append orphaned children.
|
|
/// </summary>
|
|
/// <param name="snapshot">Snapshot to remove.</param>
|
|
public void Remove(VMWareSnapshot snapshot)
|
|
{
|
|
if (_snapshots != null)
|
|
{
|
|
_snapshots.Remove(snapshot);
|
|
|
|
foreach (VMWareSnapshot childSnapshot in snapshot.ChildSnapshots)
|
|
{
|
|
childSnapshot.Parent = _parent;
|
|
_snapshots.Add(childSnapshot);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Remove all elements from the snapshot collection.
|
|
/// </summary>
|
|
public void RemoveAll()
|
|
{
|
|
if (_snapshots != null)
|
|
{
|
|
foreach (VMWareSnapshot snapshot in _snapshots)
|
|
{
|
|
snapshot.Dispose();
|
|
}
|
|
|
|
_snapshots = null;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Dispose the collection.
|
|
/// </summary>
|
|
public void Dispose()
|
|
{
|
|
RemoveAll();
|
|
_parent = null;
|
|
_vm = null;
|
|
}
|
|
}
|
|
}
|