blob: 4fee84adb40b5a4251d1cc9df58d441ce10fb9e3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
/*****************************************************************************/
/* */
/* proton.Data.Uuid */
/* */
/*****************************************************************************/
/**
* Create a proton.Data.Uuid which is a type 4 UUID.
* @classdesc
* This class represents a type 4 UUID, wich may use crypto libraries to generate
* the UUID if supported by the platform (e.g. node.js or a modern browser)
* @constructor proton.Data.Uuid
* @param {number|Array|string} u a UUID. If null a type 4 UUID is generated wich may use crypto if
* supported by the platform. If u is an emscripten "pointer" we copy the
* data from that. If u is a JavaScript Array we use it as-is. If u is a
* String then we try to parse that as a UUID.
* @property {Array} uuid is the compact array form of the UUID.
*/
Data['Uuid'] = function(u) { // Data.Uuid Constructor.
// Helper to copy from emscriptem allocated storage into JavaScript Array.
function _p2a(p) {
var uuid = new Array(16);
for (var i = 0; i < 16; i++) {
uuid[i] = getValue(p + i, 'i8') & 0xFF; // & 0xFF converts to unsigned.
}
return uuid;
};
if (!u) { // Generate UUID using emscriptem's uuid_generate implementation.
var sp = Runtime.stackSave();
var p = allocate(16, 'i8', ALLOC_STACK); // Create temporary pointer storage.
_uuid_generate(p); // Generate UUID into allocated pointer.
this['uuid'] = _p2a(p); // Copy from allocated storage into JavaScript Array.
Runtime.stackRestore(sp);
} else if (Data.isNumber(u)) { // Use pointer that has been passed in.
this['uuid'] = _p2a(u); // Copy from allocated storage into JavaScript Array.
} else if (Data.isArray(u)) { // Use array that has been passed in.
this['uuid'] = u; // Just use the JavaScript Array.
} else if (Data.isString(u)) { // Parse String form UUID.
if (u.length === 36) {
var i = 0;
var uuid = new Array(16);
u.toLowerCase().replace(/[0-9a-f]{2}/g, function(byte) {
if (i < 16) {
uuid[i++] = parseInt(byte, 16);
}
});
this['uuid'] = uuid;
}
}
this.string = null;
};
/**
* Returns the string representation of the proton.Data.Uuid.
* @method toString
* @memberof! proton.Data.Uuid#
* @returns {string} the String
* /[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}/
* form of a {@link proton.Data.Uuid}.
*/
Data['Uuid'].prototype.toString = Data['Uuid'].prototype.valueOf = function() {
if (!this.string) { // Check if we've cached the string version.
var i = 0;
var uu = this['uuid'];
var uuid = 'xxxx-xx-xx-xx-xxxxxx'.replace(/[x]/g, function(c) {
var r = uu[i].toString(16);
r = (r.length === 1) ? '0' + r : r; // Zero pad single digit hex values
i++;
return r;
});
this.string = uuid;
}
return this.string;
};
/**
* Compare two instances of proton.Data.Uuid for equality.
* @method equals
* @memberof! proton.Data.Uuid#
* @param {proton.Data.Uuid} rhs the instance we wish to compare this instance with.
* @returns {boolean} true iff the two compared instances are equal.
*/
Data['Uuid'].prototype['equals'] = function(rhs) {
return this.toString() === rhs.toString();
};