Version.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //
  2. // System.Version.cs
  3. //
  4. // Author:
  5. // Miguel de Icaza ([email protected])
  6. //
  7. // (C) Ximian, Inc. http://www.ximian.com
  8. //
  9. namespace System {
  10. public sealed class Version : ICloneable, IComparable {
  11. int major, minor, build, revision;
  12. const int MAXINT = int.MaxValue;
  13. public Version (string version)
  14. {
  15. int n;
  16. string [] vals = version.Split (new Char [] {'.'});
  17. n = vals.Length;
  18. if (n > 0)
  19. major = int.Parse (vals [0]);
  20. if (n > 1)
  21. minor = int.Parse (vals [1]);
  22. if (n > 2)
  23. build = int.Parse (vals [2]);
  24. if (n > 3)
  25. revision = int.Parse (vals [3]);
  26. }
  27. public Version (int major, int minor)
  28. {
  29. this.major = major;
  30. this.minor = minor;
  31. this.build = MAXINT;
  32. this.revision = MAXINT;
  33. }
  34. public Version (int major, int minor, int build)
  35. {
  36. this.major = major;
  37. this.minor = minor;
  38. this.build = build;
  39. this.revision = MAXINT;
  40. }
  41. public Version (int major, int minor, int build, int revision)
  42. {
  43. this.major = major;
  44. this.minor = minor;
  45. this.build = build;
  46. this.revision = revision;
  47. }
  48. public int Build {
  49. get {
  50. return build;
  51. }
  52. }
  53. public int Major {
  54. get {
  55. return major;
  56. }
  57. }
  58. public int Minor {
  59. get {
  60. return minor;
  61. }
  62. }
  63. public int Revision {
  64. get {
  65. return revision;
  66. }
  67. }
  68. public object Clone ()
  69. {
  70. return new Version (major, minor, build, revision);
  71. }
  72. public int CompareTo (object version)
  73. {
  74. Version v;
  75. if (version == null)
  76. throw new ArgumentNullException ("version");
  77. if (! (version is Version))
  78. throw new ArgumentException ("version");
  79. v = version as Version;
  80. if (this.major > v.major)
  81. return 1;
  82. else if (this.major < v.major)
  83. return -1;
  84. if (this.minor > v.minor)
  85. return 1;
  86. else if (this.minor < this.minor)
  87. return -1;
  88. if (this.build > v.build)
  89. return 1;
  90. else if (this.build < this.build)
  91. return -1;
  92. // FIXME: Compare revision or build first?
  93. if (this.revision > v.revision)
  94. return 1;
  95. else if (this.revision < v.revision)
  96. return -1;
  97. return 0;
  98. }
  99. public override bool Equals (object obj)
  100. {
  101. Version x;
  102. if (obj == null)
  103. throw new ArgumentNullException ("obj");
  104. if (!(obj is Version))
  105. return false;
  106. x = (Version) obj;
  107. if ((x.major == major) &&
  108. (x.minor == minor) &&
  109. (x.build == build) &&
  110. (x.revision == revision))
  111. return true;
  112. return false;
  113. }
  114. public override int GetHashCode ()
  115. {
  116. return (revision << 24) | (build << 16) | (minor << 8) | major;
  117. }
  118. // <summary>
  119. // Returns a stringified representation of the version, format:
  120. // major.minor[.build[.revision]]
  121. // </summary>
  122. public override string ToString ()
  123. {
  124. string mm = major.ToString () + "." + minor.ToString ();
  125. if (build != MAXINT)
  126. mm = mm + "." + build.ToString ();
  127. if (revision != MAXINT)
  128. mm = mm + "." + revision.ToString ();
  129. return mm;
  130. }
  131. // <summary>
  132. // LAME: This API is lame, since there is no way of knowing
  133. // how many fields a Version object has, it is unfair to throw
  134. // an ArgumentException, but this is what the spec claims.
  135. //
  136. // ie, Version a = new Version (1, 2); a.ToString (3) should
  137. // throw the expcetion.
  138. // </summary>
  139. public string ToString (int fields)
  140. {
  141. if (fields == 0)
  142. return "";
  143. if (fields == 1)
  144. return major.ToString ();
  145. if (fields == 2)
  146. return major.ToString () + "." + minor.ToString ();
  147. if (fields == 3){
  148. if (build == MAXINT)
  149. throw new ArgumentException ("fields is larger than the number of components defined in this instance");
  150. return major.ToString () + "." + minor.ToString () + "." +
  151. build.ToString ();
  152. }
  153. if (fields == 4){
  154. if (build == MAXINT || revision == MAXINT)
  155. throw new ArgumentException ("fields is larger than the number of components defined in this instance");
  156. return major.ToString () + "." + minor.ToString () + "." +
  157. build.ToString () + "." + revision.ToString ();
  158. }
  159. throw new ArgumentException ("Invalid fields parameter: " + fields.ToString());
  160. }
  161. }
  162. }