DynamicVolume.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /* Copyright (C) 2014 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
  2. *
  3. * You can redistribute this program and/or modify it under the terms of
  4. * the GNU Lesser Public License as published by the Free Software Foundation,
  5. * either version 3 of the License, or (at your option) any later version.
  6. */
  7. using System;
  8. using System.Collections.Generic;
  9. using System.IO;
  10. using System.Text;
  11. using DiskAccessLibrary;
  12. using Utilities;
  13. namespace DiskAccessLibrary.LogicalDiskManager
  14. {
  15. public abstract class DynamicVolume : Volume
  16. {
  17. // dynamic disks will only work with 512-byte sectors
  18. // http://msdn.microsoft.com/en-us/windows/hardware/gg463528
  19. // Note: Simple volumes will somewhat work on > 512-byte sectors
  20. public const int BytesPerDynamicDiskSector = 512;
  21. private Guid m_volumeGuid;
  22. private Guid m_diskGroupGuid;
  23. public ulong VolumeID;
  24. public string Name;
  25. public string DiskGroupName;
  26. public DynamicVolume(Guid volumeGuid, Guid diskGroupGuid)
  27. {
  28. m_volumeGuid = volumeGuid;
  29. m_diskGroupGuid = diskGroupGuid;
  30. }
  31. public override bool Equals(object obj)
  32. {
  33. if (obj is DynamicVolume)
  34. {
  35. return ((DynamicVolume)obj).VolumeGuid == this.VolumeGuid;
  36. }
  37. return false;
  38. }
  39. public override int GetHashCode()
  40. {
  41. return this.VolumeGuid.GetHashCode();
  42. }
  43. public override int BytesPerSector
  44. {
  45. get
  46. {
  47. return BytesPerDynamicDiskSector;
  48. }
  49. }
  50. public Guid VolumeGuid
  51. {
  52. get
  53. {
  54. return m_volumeGuid;
  55. }
  56. }
  57. public Guid DiskGroupGuid
  58. {
  59. get
  60. {
  61. return m_diskGroupGuid;
  62. }
  63. }
  64. public override List<DiskExtent> Extents
  65. {
  66. get
  67. {
  68. List<DiskExtent> result = new List<DiskExtent>();
  69. foreach (DynamicDiskExtent extent in this.DynamicExtents)
  70. {
  71. result.Add(extent);
  72. }
  73. return result;
  74. }
  75. }
  76. public abstract List<DynamicColumn> Columns
  77. {
  78. get;
  79. }
  80. public List<DynamicDiskExtent> DynamicExtents
  81. {
  82. get
  83. {
  84. List<DynamicDiskExtent> result = new List<DynamicDiskExtent>();
  85. foreach (DynamicColumn column in Columns)
  86. {
  87. result.AddRange(column.Extents);
  88. }
  89. return result;
  90. }
  91. }
  92. public virtual bool IsHealthy
  93. {
  94. get
  95. {
  96. foreach (DynamicColumn column in this.Columns)
  97. {
  98. if (!column.IsOperational)
  99. {
  100. return false;
  101. }
  102. }
  103. return true;
  104. }
  105. }
  106. public virtual bool IsOperational
  107. {
  108. get
  109. {
  110. return IsHealthy;
  111. }
  112. }
  113. }
  114. }