Compress model and texture file data in multipart/form-data

A compress() method is added to the JavaScript ArrayBuffer object.
This commit is contained in:
David Rowe 2014-07-29 13:52:52 -07:00
parent 5a5bbfd612
commit 287e3d6800
3 changed files with 21 additions and 3 deletions

View file

@ -184,8 +184,9 @@ var httpMultiPart = (function () {
// - name, string
// - name, buffer
var buffer,
string,
stringBuffer,
string;
compressedBuffer;
if (object.name === undefined) {
@ -217,9 +218,10 @@ var httpMultiPart = (function () {
+ "\r\n";
stringBuffer = string.toArrayBuffer();
buffer = new Uint8Array(stringBuffer.byteLength + object.buffer.buffer.byteLength);
compressedBuffer = object.buffer.buffer.compress();
buffer = new Uint8Array(stringBuffer.byteLength + compressedBuffer.byteLength);
buffer.set(new Uint8Array(stringBuffer));
buffer.set(new Uint8Array(object.buffer.buffer), stringBuffer.byteLength);
buffer.set(new Uint8Array(compressedBuffer), stringBuffer.byteLength);
} else {

View file

@ -14,6 +14,9 @@
#include "ArrayBufferClass.h"
#include "ArrayBufferPrototype.h"
static const int QCOMPRESS_HEADER_POSITION = 0;
static const int QCOMPRESS_HEADER_SIZE = 4;
Q_DECLARE_METATYPE(QByteArray*)
ArrayBufferPrototype::ArrayBufferPrototype(QObject* parent) : QObject(parent) {
@ -43,6 +46,18 @@ QByteArray ArrayBufferPrototype::slice(qint32 begin) const {
return ba->mid(begin, -1);
}
QByteArray ArrayBufferPrototype::compress() const {
QByteArray* ba = thisArrayBuffer();
QByteArray buffer = qCompress(*ba);
// Qt's qCompress() default compression level (-1) is the standard zLib compression.
// Here remove Qt's custom header that prevents the data server from uncompressing the files with zLib.
buffer.remove(QCOMPRESS_HEADER_POSITION, QCOMPRESS_HEADER_SIZE);
return buffer;
}
QByteArray* ArrayBufferPrototype::thisArrayBuffer() const {
return qscriptvalue_cast<QByteArray*>(thisObject().data());
}

View file

@ -23,6 +23,7 @@ public:
public slots:
QByteArray slice(qint32 begin, qint32 end) const;
QByteArray slice(qint32 begin) const;
QByteArray compress() const;
private:
QByteArray* thisArrayBuffer() const;