_base.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /*
  2. Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
  3. Available via Academic Free License >= 2.1 OR the modified BSD license.
  4. see: http://dojotoolkit.org/license for details
  5. */
  6. if(!dojo._hasResource["dojox.uuid._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
  7. dojo._hasResource["dojox.uuid._base"] = true;
  8. dojo.provide("dojox.uuid._base");
  9. // Public constants:
  10. dojox.uuid.NIL_UUID = "00000000-0000-0000-0000-000000000000";
  11. dojox.uuid.version = {
  12. // Enumeration for the different UUID versions.
  13. UNKNOWN: 0,
  14. TIME_BASED: 1,
  15. DCE_SECURITY: 2,
  16. NAME_BASED_MD5: 3,
  17. RANDOM: 4,
  18. NAME_BASED_SHA1: 5 };
  19. dojox.uuid.variant = {
  20. // Enumeration for the different UUID variants.
  21. NCS: "0",
  22. DCE: "10",
  23. MICROSOFT: "110",
  24. UNKNOWN: "111" };
  25. dojox.uuid.assert = function(/*Boolean*/ booleanValue, /*String?*/ message){
  26. // summary:
  27. // Throws an exception if the assertion fails.
  28. // description:
  29. // If the asserted condition is true, this method does nothing. If the
  30. // condition is false, we throw an error with a error message.
  31. // booleanValue: Must be true for the assertion to succeed.
  32. // message: A string describing the assertion.
  33. // throws: Throws an Error if 'booleanValue' is false.
  34. if(!booleanValue){
  35. if(!message){
  36. message = "An assert statement failed.\n" +
  37. "The method dojox.uuid.assert() was called with a 'false' value.\n";
  38. }
  39. throw new Error(message);
  40. }
  41. };
  42. dojox.uuid.generateNilUuid = function(){
  43. // summary:
  44. // This function returns the Nil UUID: "00000000-0000-0000-0000-000000000000".
  45. // description:
  46. // The Nil UUID is described in section 4.1.7 of
  47. // RFC 4122: http://tools.ietf.org/html/rfc4122#section-4.1.7
  48. // examples:
  49. // var string = dojox.uuid.generateNilUuid();
  50. return dojox.uuid.NIL_UUID; // String
  51. };
  52. dojox.uuid.isValid = function(/*String*/ uuidString){
  53. // summary:
  54. // Returns true if the UUID was initialized with a valid value.
  55. uuidString = uuidString.toString();
  56. var valid = (dojo.isString(uuidString) &&
  57. (uuidString.length == 36) &&
  58. (uuidString == uuidString.toLowerCase()));
  59. if(valid){
  60. var arrayOfParts = uuidString.split("-");
  61. valid = ((arrayOfParts.length == 5) &&
  62. (arrayOfParts[0].length == 8) &&
  63. (arrayOfParts[1].length == 4) &&
  64. (arrayOfParts[2].length == 4) &&
  65. (arrayOfParts[3].length == 4) &&
  66. (arrayOfParts[4].length == 12));
  67. var HEX_RADIX = 16;
  68. for (var i in arrayOfParts) {
  69. var part = arrayOfParts[i];
  70. var integer = parseInt(part, HEX_RADIX);
  71. valid = valid && isFinite(integer);
  72. }
  73. }
  74. return valid; // boolean
  75. };
  76. dojox.uuid.getVariant = function(/*String*/ uuidString){
  77. // summary:
  78. // Returns a variant code that indicates what type of UUID this is.
  79. // Returns one of the enumerated dojox.uuid.variant values.
  80. // example:
  81. // var variant = dojox.uuid.getVariant("3b12f1df-5232-4804-897e-917bf397618a");
  82. // dojox.uuid.assert(variant == dojox.uuid.variant.DCE);
  83. // example:
  84. // "3b12f1df-5232-4804-897e-917bf397618a"
  85. // ^
  86. // |
  87. // (variant "10__" == DCE)
  88. if(!dojox.uuid._ourVariantLookupTable){
  89. var variant = dojox.uuid.variant;
  90. var lookupTable = [];
  91. lookupTable[0x0] = variant.NCS; // 0000
  92. lookupTable[0x1] = variant.NCS; // 0001
  93. lookupTable[0x2] = variant.NCS; // 0010
  94. lookupTable[0x3] = variant.NCS; // 0011
  95. lookupTable[0x4] = variant.NCS; // 0100
  96. lookupTable[0x5] = variant.NCS; // 0101
  97. lookupTable[0x6] = variant.NCS; // 0110
  98. lookupTable[0x7] = variant.NCS; // 0111
  99. lookupTable[0x8] = variant.DCE; // 1000
  100. lookupTable[0x9] = variant.DCE; // 1001
  101. lookupTable[0xA] = variant.DCE; // 1010
  102. lookupTable[0xB] = variant.DCE; // 1011
  103. lookupTable[0xC] = variant.MICROSOFT; // 1100
  104. lookupTable[0xD] = variant.MICROSOFT; // 1101
  105. lookupTable[0xE] = variant.UNKNOWN; // 1110
  106. lookupTable[0xF] = variant.UNKNOWN; // 1111
  107. dojox.uuid._ourVariantLookupTable = lookupTable;
  108. }
  109. uuidString = uuidString.toString();
  110. var variantCharacter = uuidString.charAt(19);
  111. var HEX_RADIX = 16;
  112. var variantNumber = parseInt(variantCharacter, HEX_RADIX);
  113. dojox.uuid.assert((variantNumber >= 0) && (variantNumber <= 16));
  114. return dojox.uuid._ourVariantLookupTable[variantNumber]; // dojox.uuid.variant
  115. };
  116. dojox.uuid.getVersion = function(/*String*/ uuidString){
  117. // summary:
  118. // Returns a version number that indicates what type of UUID this is.
  119. // Returns one of the enumerated dojox.uuid.version values.
  120. // example:
  121. // var version = dojox.uuid.getVersion("b4308fb0-86cd-11da-a72b-0800200c9a66");
  122. // dojox.uuid.assert(version == dojox.uuid.version.TIME_BASED);
  123. // exceptions:
  124. // Throws an Error if this is not a DCE Variant UUID.
  125. var errorMessage = "dojox.uuid.getVersion() was not passed a DCE Variant UUID.";
  126. dojox.uuid.assert(dojox.uuid.getVariant(uuidString) == dojox.uuid.variant.DCE, errorMessage);
  127. uuidString = uuidString.toString();
  128. // "b4308fb0-86cd-11da-a72b-0800200c9a66"
  129. // ^
  130. // |
  131. // (version 1 == TIME_BASED)
  132. var versionCharacter = uuidString.charAt(14);
  133. var HEX_RADIX = 16;
  134. var versionNumber = parseInt(versionCharacter, HEX_RADIX);
  135. return versionNumber; // dojox.uuid.version
  136. };
  137. dojox.uuid.getNode = function(/*String*/ uuidString){
  138. // summary:
  139. // If this is a version 1 UUID (a time-based UUID), getNode() returns a
  140. // 12-character string with the "node" or "pseudonode" portion of the UUID,
  141. // which is the rightmost 12 characters.
  142. // exceptions:
  143. // Throws an Error if this is not a version 1 UUID.
  144. var errorMessage = "dojox.uuid.getNode() was not passed a TIME_BASED UUID.";
  145. dojox.uuid.assert(dojox.uuid.getVersion(uuidString) == dojox.uuid.version.TIME_BASED, errorMessage);
  146. uuidString = uuidString.toString();
  147. var arrayOfStrings = uuidString.split('-');
  148. var nodeString = arrayOfStrings[4];
  149. return nodeString; // String (a 12-character string, which will look something like "917bf397618a")
  150. };
  151. dojox.uuid.getTimestamp = function(/*String*/ uuidString, /*String?*/ returnType){
  152. // summary:
  153. // If this is a version 1 UUID (a time-based UUID), this method returns
  154. // the timestamp value encoded in the UUID. The caller can ask for the
  155. // timestamp to be returned either as a JavaScript Date object or as a
  156. // 15-character string of hex digits.
  157. // returnType: Any of these five values: "string", String, "hex", "date", Date
  158. // returns:
  159. // Returns the timestamp value as a JavaScript Date object or a 15-character string of hex digits.
  160. // examples:
  161. // var uuidString = "b4308fb0-86cd-11da-a72b-0800200c9a66";
  162. // var date, string, hexString;
  163. // date = dojox.uuid.getTimestamp(uuidString); // returns a JavaScript Date
  164. // date = dojox.uuid.getTimestamp(uuidString, Date); //
  165. // string = dojox.uuid.getTimestamp(uuidString, String); // "Mon, 16 Jan 2006 20:21:41 GMT"
  166. // hexString = dojox.uuid.getTimestamp(uuidString, "hex"); // "1da86cdb4308fb0"
  167. // exceptions:
  168. // Throws an Error if this is not a version 1 UUID.
  169. var errorMessage = "dojox.uuid.getTimestamp() was not passed a TIME_BASED UUID.";
  170. dojox.uuid.assert(dojox.uuid.getVersion(uuidString) == dojox.uuid.version.TIME_BASED, errorMessage);
  171. uuidString = uuidString.toString();
  172. if(!returnType){returnType = null};
  173. switch(returnType){
  174. case "string":
  175. case String:
  176. return dojox.uuid.getTimestamp(uuidString, Date).toUTCString(); // String (e.g. "Mon, 16 Jan 2006 20:21:41 GMT")
  177. break;
  178. case "hex":
  179. // Return a 15-character string of hex digits containing the
  180. // timestamp for this UUID, with the high-order bits first.
  181. var arrayOfStrings = uuidString.split('-');
  182. var hexTimeLow = arrayOfStrings[0];
  183. var hexTimeMid = arrayOfStrings[1];
  184. var hexTimeHigh = arrayOfStrings[2];
  185. // Chop off the leading "1" character, which is the UUID
  186. // version number for time-based UUIDs.
  187. hexTimeHigh = hexTimeHigh.slice(1);
  188. var timestampAsHexString = hexTimeHigh + hexTimeMid + hexTimeLow;
  189. dojox.uuid.assert(timestampAsHexString.length == 15);
  190. return timestampAsHexString; // String (e.g. "1da86cdb4308fb0")
  191. break;
  192. case null: // no returnType was specified, so default to Date
  193. case "date":
  194. case Date:
  195. // Return a JavaScript Date object.
  196. var GREGORIAN_CHANGE_OFFSET_IN_HOURS = 3394248;
  197. var HEX_RADIX = 16;
  198. var arrayOfParts = uuidString.split('-');
  199. var timeLow = parseInt(arrayOfParts[0], HEX_RADIX);
  200. var timeMid = parseInt(arrayOfParts[1], HEX_RADIX);
  201. var timeHigh = parseInt(arrayOfParts[2], HEX_RADIX);
  202. var hundredNanosecondIntervalsSince1582 = timeHigh & 0x0FFF;
  203. hundredNanosecondIntervalsSince1582 <<= 16;
  204. hundredNanosecondIntervalsSince1582 += timeMid;
  205. // What we really want to do next is shift left 32 bits, but the
  206. // result will be too big to fit in an int, so we'll multiply by 2^32,
  207. // and the result will be a floating point approximation.
  208. hundredNanosecondIntervalsSince1582 *= 0x100000000;
  209. hundredNanosecondIntervalsSince1582 += timeLow;
  210. var millisecondsSince1582 = hundredNanosecondIntervalsSince1582 / 10000;
  211. // Again, this will be a floating point approximation.
  212. // We can make things exact later if we need to.
  213. var secondsPerHour = 60 * 60;
  214. var hoursBetween1582and1970 = GREGORIAN_CHANGE_OFFSET_IN_HOURS;
  215. var secondsBetween1582and1970 = hoursBetween1582and1970 * secondsPerHour;
  216. var millisecondsBetween1582and1970 = secondsBetween1582and1970 * 1000;
  217. var millisecondsSince1970 = millisecondsSince1582 - millisecondsBetween1582and1970;
  218. var timestampAsDate = new Date(millisecondsSince1970);
  219. return timestampAsDate; // Date
  220. break;
  221. default:
  222. // we got passed something other than a valid returnType
  223. dojox.uuid.assert(false, "dojox.uuid.getTimestamp was not passed a valid returnType: " + returnType);
  224. break;
  225. }
  226. };
  227. }