Files
UnrealEngineUWP/Engine/Source/Runtime/HTML5/HTML5JS/Private/HTML5JavaScriptFx.js
Ankit Khare 7a5cd45172 Github Pull Request : 345 Feature: Implement a basic HTTP request support for the HTML5 platform
#codereview james.moran

[CL 2321802 by Ankit Khare in Main branch]
2014-10-07 16:49:35 -04:00

169 lines
5.5 KiB
JavaScript

// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
var UE_JavaScriptLibary =
{
UE_SendAndRecievePayLoad: function (url, indata, insize, outdataptr, outsizeptr) {
var _url = Pointer_stringify(url)
var request = new XMLHttpRequest();
if (insize && indata) {
var postData = Module.HEAP8.subarray(indata, indata + insize);
request.open('POST', _url, false);
request.overrideMimeType('text\/plain; charset=x-user-defined');
request.send(postData);
} else {
request.open('GET', _url, false);
request.send();
}
if (request.status != 200) {
console.log("Fetching " + _url + " failed: " + request.responseText);
Module.HEAP32[outsizeptr >> 2] = 0;
Module.HEAP32[outdataptr >> 2] = 0;
return;
}
// we got the XHR result as a string. We need to write this to Module.HEAP8[outdataptr]
var replyString = request.responseText;
var replyLength = replyString.length;
var outdata = Module._malloc(replyLength);
if (!outdata) {
console.log("Failed to allocate " + replyLength + " bytes in heap for reply");
Module.HEAP32[outsizeptr >> 2] = 0;
Module.HEAP32[outdataptr >> 2] = 0;
return;
}
// tears and crying. Copy from the result-string into the heap.
var replyDest = Module.HEAP8.subarray(outdata, outdata + replyLength);
for (var i = 0; i < replyLength; ++i) {
replyDest[i] = replyString.charCodeAt(i) & 0xff;
}
Module.HEAP32[outsizeptr >> 2] = replyLength;
Module.HEAP32[outdataptr >> 2] = outdata;
},
UE_SaveGame: function (name, userIndex, indata, insize){
// user index is not used.
var _name = Pointer_stringify(name);
var gamedata = Module.HEAP8.subarray(indata, indata + insize);
// local storage only takes strings, we need to convert string to base64 before storing.
var b64encoded = base64EncArr(gamedata);
$.jStorage.set(_name, b64encoded);
return true;
},
UE_LoadGame: function (name, userIndex, outdataptr, outsizeptr){
var _name = Pointer_stringify(name);
// local storage only takes strings, we need to convert string to base64 before storing.
var b64encoded = $.jStorage.get(_name);
if (typeof b64encoded == null)
return false;
var decodedArray = base64DecToArr(b64encoded);
// copy back the decoded array.
var outdata = Module._malloc(decodedArray.length);
// view the allocated data as a HEAP8.
var dest = Module.HEAP8.subarray(outdata, outdata + decodedArray.length);
// copy back.
for (var i = 0; i < decodedArray.length; ++i) {
dest[i] = decodedArray[i];
}
Module.HEAP32[outsizeptr >> 2] = decodedArray.length;
Module.HEAP32[outdataptr >> 2] = outdata;
return true;
},
UE_DoesSaveGameExist: function (name, userIndex){
var _name = Pointer_stringify(name);
var b64encoded = $.jStorage.get(_name);
if (b64encoded == null)
return false;
return true;
},
UE_MessageBox: function (type, message, caption ) {
// type maps to EAppMsgType::Type
if ( type == 0 ){
var text = Pointer_stringify(message);
if (!confirm(text))
return 0;
} else {
var text = Pointer_stringify(message);
alert(text);
}
return 1;
},
UE_GetCurrentCultureName: function (address, outsize) {
var culture_name = navigator.language || navigator.browserLanguage;
if (culture_name.lenght >= outsize) {
return 0;
}
Module.writeAsciiToMemory(culture_name, address);
return 1;
},
UE_MakeHTTPDataRequest: function (ctx, url, verb, payload, freeBuffer, onload, onerror, onprogress) {
var _url = Pointer_stringify(url);
var _verb = Pointer_stringify(verb);
var _payload = Pointer_stringify(payload);
var xhr = new XMLHttpRequest();
xhr.open(_verb, _url, true);
xhr.responseType = 'arraybuffer';
// Onload event handler
xhr.addEventListener('load', function (e) {
if (xhr.status === 200 || _url.substr(0, 4).toLowerCase() !== "http") {
var byteArray = new Uint8Array(xhr.response);
var buffer = _malloc(byteArray.length);
HEAPU8.set(byteArray, buffer);
if (onload)
Runtime.dynCall('viii', onload, [ctx, buffer, byteArray.length]);
if (freeBuffer)
_free(buffer);
}
else{
if (onerror) Runtime.dynCall('viii', onerror, [ctx, xhr.status, xhr.statusText]);
}
});
// Onerror event handler
xhr.addEventListener('error', function (e) {
if (onerror) Runtime.dynCall('viii', onerror, [ctx, xhr.status, xhr.statusText]);
});
// Onprogress event handler
xhr.addEventListener('progress', function (e) {
if (onprogress) Runtime.dynCall('viii', onprogress, [ctx, e.loaded, e.lengthComputable || e.lengthComputable === undefined ? e.total : 0]);
});
// Bypass possible browser redirection limit
try {
if (xhr.channel instanceof Ci.nsIHttpChannel)
xhr.channel.redirectionLimit = 0;
} catch (ex) { }
if (_verb === "POST") {
//Send the proper header information along with the request
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("Content-length", _payload.length);
xhr.setRequestHeader("Connection", "close");
xhr.send(_payload);
} else {
xhr.send(null);
}
}
};
mergeInto(LibraryManager.library, UE_JavaScriptLibary);