_base.js 9.4 KB

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