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