|  |  |  | /* | 
					
						
							|  |  |  |  * vim: ts=4:sw=4:expandtab | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function ProtoParser(arrayBuffer, protobuf) { | 
					
						
							|  |  |  |     this.protobuf = protobuf; | 
					
						
							|  |  |  |     this.buffer = new dcodeIO.ByteBuffer(); | 
					
						
							|  |  |  |     this.buffer.append(arrayBuffer); | 
					
						
							|  |  |  |     this.buffer.offset = 0; | 
					
						
							|  |  |  |     this.buffer.limit = arrayBuffer.byteLength; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ProtoParser.prototype = { | 
					
						
							|  |  |  |     constructor: ProtoParser, | 
					
						
							|  |  |  |     next: function() { | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |             if (this.buffer.limit === this.buffer.offset) { | 
					
						
							|  |  |  |                 return undefined; // eof
 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             var len = this.buffer.readVarint32(); | 
					
						
							|  |  |  |             var nextBuffer = this.buffer.slice( | 
					
						
							|  |  |  |                 this.buffer.offset, this.buffer.offset+len | 
					
						
							|  |  |  |             ).toArrayBuffer(); | 
					
						
							|  |  |  |             // TODO: de-dupe ByteBuffer.js includes in libaxo/libts
 | 
					
						
							|  |  |  |             // then remove this toArrayBuffer call.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             var proto = this.protobuf.decode(nextBuffer); | 
					
						
							|  |  |  |             this.buffer.skip(len); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (proto.avatar) { | 
					
						
							|  |  |  |                 var attachmentLen = proto.avatar.length; | 
					
						
							|  |  |  |                 proto.avatar.data = this.buffer.slice( | 
					
						
							|  |  |  |                     this.buffer.offset, this.buffer.offset + attachmentLen | 
					
						
							|  |  |  |                 ).toArrayBuffer(); | 
					
						
							|  |  |  |                 this.buffer.skip(attachmentLen); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return proto; | 
					
						
							|  |  |  |         } catch(e) { | 
					
						
							|  |  |  |             console.log(e); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | var GroupBuffer = function(arrayBuffer) { | 
					
						
							|  |  |  |     ProtoParser.call(this, arrayBuffer, textsecure.protobuf.GroupDetails); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | GroupBuffer.prototype = Object.create(ProtoParser.prototype); | 
					
						
							|  |  |  | GroupBuffer.prototype.constructor = GroupBuffer; | 
					
						
							|  |  |  | var ContactBuffer = function(arrayBuffer) { | 
					
						
							|  |  |  |     ProtoParser.call(this, arrayBuffer, textsecure.protobuf.ContactDetails); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | ContactBuffer.prototype = Object.create(ProtoParser.prototype); | 
					
						
							|  |  |  | ContactBuffer.prototype.constructor = ContactBuffer; |