app/assets/javascripts/condo/md5/hasher.js in condo-1.0.4 vs app/assets/javascripts/condo/md5/hasher.js in condo-1.0.6
- old
+ new
@@ -1,100 +1,119 @@
-
-
-var CondoMD5Hasher = (function(global) {
-
- var part_size = 1048576, // This is the amount of the file we read into memory as we are building the hash (1mb)
- async = true;
-
- //
- // Firefox does not have FileReader in webworkers? WTF
- // See issue #2
- //
- if (!!!global.FileReader) {
- async = false;
- global.FileReader = global.FileReaderSync;
- }
-
- //
- // Some browsers have a vendor prefix on slice
- //
- if (!!!Blob.prototype.slice) {
- Blob.prototype.slice = Blob.prototype.webkitSlice || Blob.prototype.mozSlice;
- }
-
- return function(callback) {
-
-
- //
- // responds with: {success: true|false, result: <Object>}
- //
- this.hash = function(blob) {
-
- var current_part,
- md5 = new global.SparkMD5(),
- reader = new global.FileReader(),
- part_number = 0,
- length = Math.ceil(blob.size / part_size),
- fail = function() {
- callback({
- success: false,
- result: 'file read failed'
- });
- },
- hashData = function(e) {
- md5.appendBinary(e.target.result);
- if(part_number * part_size >= blob.size) {
- callback({
- success: true,
- result: md5.end()
- });
- } else {
- processPart();
- }
- },
- processPart = function() {
- var endbyte = 0;
-
- part_number += 1;
-
- if (blob.size > part_size) { // If blob bigger then part_size we will slice it up
- endbyte = part_number * part_size;
- if (endbyte > blob.size)
- endbyte = blob.size;
-
- current_part = blob.slice((part_number - 1) * part_size, endbyte);
- } else {
- current_part = blob;
- }
-
- if(async)
- reader.readAsArrayBuffer(current_part);
- else {
- setTimeout(function() {
- try {
- hashData({
- target: {
- result: reader.readAsArrayBuffer(current_part)
- }
- });
- } catch (e) {
- fail();
- }
- }, 1);
- }
-
- };
-
-
- if(async) {
- reader.onload = hashData;
- reader.onerror = fail;
- reader.onabort = fail;
- }
-
-
- processPart();
- };
- };
-
-})(this);
-
+
+
+var CondoMD5Hasher = (function(global) {
+
+ var part_size = 1048576, // This is the amount of the file we read into memory as we are building the hash (1mb)
+ async = true,
+ newReader = !!navigator.userAgent.toLowerCase().match(/opera/); // Opera bug (opera can only use a reader once)
+
+
+ //
+ // Firefox does not have FileReader in webworkers? WTF
+ // See issue #2
+ //
+ if (!!!global.FileReader) {
+ async = false;
+ global.FileReader = global.FileReaderSync;
+ }
+
+ //
+ // Some browsers have a vendor prefix on slice
+ //
+ if (!!!Blob.prototype.slice) {
+ Blob.prototype.slice = Blob.prototype.webkitSlice || Blob.prototype.mozSlice;
+ }
+
+ return function(callback, inWorker) {
+
+
+ //
+ // Opera claims to have async readers in webworkers however it is actually just
+ // a synchronous reader in disguise
+ //
+ if (newReader && inWorker) {
+ async = false;
+ global.FileReader = global.FileReaderSync || global.FileReader;
+ }
+
+
+ //
+ // responds with: {success: true|false, result: <Object>}
+ //
+ this.hash = function(blob) {
+
+ var current_part,
+ md5 = new global.SparkMD5.ArrayBuffer(),
+ part_number = 0,
+ length = Math.ceil(blob.size / part_size),
+ reader,
+
+ fail = function() {
+ callback({
+ success: false,
+ result: 'file read failed'
+ });
+ },
+
+ hashData = function(e) {
+ md5.append(e.target.result);
+ if(part_number * part_size >= blob.size) {
+ callback({
+ success: true,
+ result: md5.end()
+ });
+ } else {
+ if (newReader) configureReader();
+ processPart();
+ }
+ },
+
+ processPart = function() {
+ var endbyte = 0;
+
+ part_number += 1;
+
+ if (blob.size > part_size) { // If blob bigger then part_size we will slice it up
+ endbyte = part_number * part_size;
+ if (endbyte > blob.size)
+ endbyte = blob.size;
+
+ current_part = blob.slice((part_number - 1) * part_size, endbyte);
+ } else {
+ current_part = blob;
+ }
+
+ if(async)
+ reader.readAsArrayBuffer(current_part);
+ else {
+ setTimeout(function() {
+ try {
+ hashData({
+ target: {
+ result: reader.readAsArrayBuffer(current_part)
+ }
+ });
+ } catch (e) {
+ fail();
+ }
+ }, 0);
+ }
+
+ },
+
+ configureReader = function() {
+ reader = new global.FileReader();
+ if(async) {
+ reader.onload = hashData;
+ reader.onerror = fail;
+ reader.onabort = fail;
+ }
+ };
+
+
+ configureReader();
+ processPart();
+ };
+ };
+
+})(this);
+