Use FileReader to base64 encode attachments

* Implements #82
This commit is contained in:
Arlo Breault 2014-11-02 13:48:35 -08:00 committed by lilia
parent 6e3014895b
commit bc5dea62c3
3 changed files with 69 additions and 55 deletions

View file

@ -21,13 +21,14 @@ textsecure.registerOnLoadFunction(function() {
} else { } else {
if (isRegistrationDone()) { if (isRegistrationDone()) {
textsecure.subscribeToPush(function(message) { textsecure.subscribeToPush(function(message) {
Whisper.Messages.addIncomingMessage(message); Whisper.Messages.addIncomingMessage(message).then(function() {
console.log("Got message from " + message.pushMessage.source + "." + message.pushMessage.sourceDevice + console.log("Got message from " + message.pushMessage.source + "." + message.pushMessage.sourceDevice +
': "' + getString(message.message.body) + '"'); ': "' + getString(message.message.body) + '"');
var newUnreadCount = textsecure.storage.getUnencrypted("unreadCount", 0) + 1; var newUnreadCount = textsecure.storage.getUnencrypted("unreadCount", 0) + 1;
textsecure.storage.putUnencrypted("unreadCount", newUnreadCount); textsecure.storage.putUnencrypted("unreadCount", newUnreadCount);
extension.navigator.setBadgeText(newUnreadCount); extension.navigator.setBadgeText(newUnreadCount);
}); });
});
} }
} }
}); });

View file

@ -30,17 +30,25 @@ var Whisper = Whisper || {};
addIncomingMessage: function(decrypted) { addIncomingMessage: function(decrypted) {
//TODO: The data in decrypted (from subscribeToPush) should already be cleaned up //TODO: The data in decrypted (from subscribeToPush) should already be cleaned up
var attachments = []; return Promise.all(decrypted.message.attachments.map(function(a) {
for (var i = 0; i < decrypted.message.attachments.length; i++) return new Promise(function(resolve, reject) {
attachments[i] = "data:" + decrypted.message.attachments[i].contentType + ";base64," + btoa(getString(decrypted.message.attachments[i].decrypted)); var dataView = new DataView(a.decrypted);
var blob = new Blob([dataView], { type: a.contentType });
var FR = new FileReader();
FR.onload = function(e) {
resolve(e.target.result);
};
FR.onerror = reject;
FR.readAsDataURL(blob);
});
})).then(function(base64_attachments) {
var thread = Whisper.Threads.findOrCreateForIncomingMessage(decrypted); var thread = Whisper.Threads.findOrCreateForIncomingMessage(decrypted);
var timestamp = decrypted.pushMessage.timestamp.toNumber(); var timestamp = decrypted.pushMessage.timestamp.toNumber();
var m = thread.messages().add({ var m = thread.messages().add({
person: decrypted.pushMessage.source, person: decrypted.pushMessage.source,
threadId: thread.id, threadId: thread.id,
body: decrypted.message.body, body: decrypted.message.body,
attachments: attachments, attachments: base64_attachments,
type: 'incoming', type: 'incoming',
timestamp: timestamp timestamp: timestamp
}); });
@ -51,6 +59,7 @@ var Whisper = Whisper || {};
} }
thread.save({unreadCount: thread.get('unreadCount') + 1, active: true}); thread.save({unreadCount: thread.get('unreadCount') + 1, active: true});
return m; return m;
});
} }
}))(); }))();

View file

@ -22,10 +22,19 @@ var Whisper = Whisper || {};
}, },
sendMessage: function(message, attachments) { sendMessage: function(message, attachments) {
var timestamp = Date.now(); return Promise.all(attachments.map(function(a) {
var base64_attachments = _.map(attachments, function(a) { return new Promise(function(resolve, reject) {
return ['data:', a.contentType, ';base64,', btoa(getString(a.data))].join(''); var dataView = new DataView(a.data);
var blob = new Blob([dataView], { type: a.contentType });
var FR = new FileReader();
FR.onload = function(e) {
resolve(e.target.result);
};
FR.onerror = reject;
FR.readAsDataURL(blob);
}); });
})).then(function(base64_attachments) {
var timestamp = Date.now();
this.messages().add({ type: 'outgoing', this.messages().add({ type: 'outgoing',
body: message, body: message,
@ -33,26 +42,21 @@ var Whisper = Whisper || {};
attachments: base64_attachments, attachments: base64_attachments,
timestamp: timestamp }).save(); timestamp: timestamp }).save();
this.save({ timestamp: timestamp, this.save({ timestamp: timestamp,
unreadCount: 0, unreadCount: 0,
active: true}); active: true});
if (this.get('type') == 'private') { if (this.get('type') == 'private') {
var promise = textsecure.messaging.sendMessageToNumber(this.get('id'), message, attachments) return textsecure.messaging.sendMessageToNumber(this.get('id'), message, attachments);
} }
else { else {
var promise = textsecure.messaging.sendMessageToGroup(this.get('groupId'), message, attachments); return textsecure.messaging.sendMessageToGroup(this.get('groupId'), message, attachments);
} }
promise.then( }.bind(this)).then(function(result) {
function(result) {
console.log(result); console.log(result);
} }).catch(function(error) {
).catch(
function(error) {
console.log(error); console.log(error);
} });
);
}, },
messages: function() { messages: function() {