RemObjectsSDK.js 75 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012
  1. //RemObjects SDK classes
  2. //interface
  3. var RemObjects = {};
  4. RemObjects.SDK = {
  5. RTTI : {
  6. },
  7. Enum : {},
  8. ROComplexType : function ROComplexType() {
  9. },
  10. ROEnumType : function ROEnumType() {
  11. },
  12. ROStructType : function ROStructType() {
  13. },
  14. ROArrayType : function ROArrayType() {
  15. this.elementType = "";
  16. this.items = [];
  17. },
  18. ROException : function ROException(e) {
  19. if (e) {
  20. this.name = e.name;
  21. this.message = e.message;
  22. };
  23. this.fields = new RemObjects.SDK.ROStructType();
  24. },
  25. ROEventSink : function ROEventSink() {
  26. },
  27. ClientChannel : function ClientChannel(aUrl) {
  28. this.url = aUrl;
  29. //post
  30. },
  31. HTTPClientChannel : function HTTPClientChannel(aUrl) {
  32. RemObjects.SDK.ClientChannel.call(this, aUrl);
  33. },
  34. Message : function Message() {
  35. this.fClientID = RemObjects.UTIL.NewGuid();
  36. this.fRequestObject = {};
  37. this.fResponseObject = {};
  38. //clone
  39. //getClientID
  40. //setClientID
  41. },
  42. JSONMessage : function JSONMessage() {
  43. RemObjects.SDK.Message.call(this);
  44. //initialize
  45. //finalize
  46. //write
  47. //read
  48. //requestStream
  49. //setResponseStream
  50. },
  51. BinMessage : function BinMessage() {
  52. RemObjects.SDK.Message.call(this);
  53. //initialize
  54. //finalize
  55. //write
  56. //read
  57. //requestStream
  58. //setResponseStream
  59. },
  60. BinHeader : function BinHeader() {
  61. this.fHeader = [0x52, 0x4f, 0x31, 0x30, 0x37]; //should contain 0x1c bytes
  62. for (var i = 5; i<0x1c; this.fHeader[i++] = 0);
  63. //readFrom
  64. //asStream
  65. //isValidHeader
  66. //getCompressed
  67. //setCompressed
  68. //getMessageType
  69. //setMessageType
  70. //setClientID
  71. // Header BINARY LAYOUT: 0x1C bytes
  72. //
  73. // Keep in sync with
  74. // - Delphi - uROBINMessage.pas
  75. // - C# - BinMessage.cs
  76. //
  77. // 52 4f 31 30 = "RO10" basic RO signature for RO 1.0
  78. // XX YY ZZ -- = XX: subversion (currenly "7")
  79. // YY: option flags: 01 = compressed
  80. // ZZ: message type as defined in uROClientIntf
  81. // --: reserved for future use
  82. // -- -- UU UU = UU: user data (word)
  83. // CC CC CC CC 0x10 bytes ClientID (guid)
  84. // CC CC CC CC
  85. // CC CC CC CC
  86. // CC CC CC CC
  87. },
  88. RemoteService : function RemoteService(aChannel, aMessage, aServiceName) {
  89. this.fChannel = aChannel;
  90. this.fMessage = aMessage;
  91. this.fServiceName = aServiceName;
  92. },
  93. ROService : function ROService(aChannel, aMessage, aServiceName) {
  94. if (RemObjects.UTIL.checkArgumentTypes(arguments, [RemObjects.SDK.ClientChannel, RemObjects.SDK.Message, "string"]) ||
  95. RemObjects.UTIL.checkArgumentTypes(arguments, [RemObjects.SDK.ClientChannel, RemObjects.SDK.Message, "undefined"])) {
  96. this.fChannel = aChannel;
  97. this.fMessage = aMessage;
  98. this.fServiceName = aServiceName;
  99. } else if (RemObjects.UTIL.checkArgumentTypes(arguments, [RemObjects.SDK.RemoteService, "undefined", "undefined"])) {
  100. this.fChannel = aChannel.fChannel;
  101. this.fMessage = aChannel.fMessage;
  102. this.fServiceName = aChannel.fServiceName;
  103. } else if (RemObjects.UTIL.checkArgumentTypes(arguments, ["string"])) { //URL
  104. var m = /https?:\/\/([-\w\.]+)+(:\d+)?\/([\w/_\.]*)/i.exec(aChannel);
  105. var path;
  106. if (m && m.length == 4 ) {
  107. path = m[3];
  108. } else {
  109. m = /https?:\/\/\[((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})\](:\d+)\/([\w/_\.]*)$/i.exec(aChannel);
  110. if (!m) {
  111. throw new Error("ROService constructor: incorrect URL");
  112. } else {
  113. path = m[14];
  114. };
  115. };
  116. if (path.toLowerCase() == "json") {
  117. this.fMessage = new RemObjects.SDK.JSONMessage();
  118. } else {
  119. this.fMessage = new RemObjects.SDK.BinMessage();
  120. };
  121. this.fChannel = new RemObjects.SDK.HTTPClientChannel(aChannel);
  122. if (typeof(aMessage) == "string") this.fServiceName = aMessage;
  123. } else if (!RemObjects.UTIL.checkArgumentTypes(arguments, ["undefined", "undefined", "undefined"])) {
  124. throw new Error("ROService constructor: Incorrect arguments");
  125. };
  126. //getChannel
  127. //getMessage
  128. //getServiceName
  129. },
  130. EventReceiver : function EventReceiver(aChannel, aMessage, aServiceName, aTimeout) {
  131. this.fChannel = aChannel;
  132. this.fMessage = aMessage;
  133. this.fServiceName = aServiceName;
  134. this.fTimeout = aTimeout;
  135. this.fActive = false;
  136. this.fHandlers = {};
  137. this.fInterval = null;
  138. //addHandler
  139. //intPollServer
  140. //setActive
  141. //getActive
  142. //getTimeout
  143. //setTimeout
  144. }
  145. };
  146. RemObjects.UTIL = {
  147. testBrowser : function testBrowser() {
  148. var result = "";
  149. if (typeof(JSON) == 'undefined')
  150. result += "Browser doesn't support JSON\n";
  151. var AJAX;
  152. if (typeof(XMLHttpRequest) == 'undefined') {
  153. try {
  154. AJAX = new XMLHttpRequest();
  155. } catch (e) {
  156. try {
  157. AJAX = new ActiveXObject("Msxml2.XMLHTTP");
  158. } catch (e) {
  159. try {
  160. AJAX = new ActiveXObject("Microsoft.XMLHTTP");
  161. } catch (e) {
  162. result += "Browser doesn't support XMLHttpRequest object\n";
  163. };
  164. };
  165. };
  166. };
  167. result += RemObjects.UTIL.testBrowserBinary();
  168. return result;
  169. },
  170. testBrowserBinary : function testBrowserBinary() {
  171. var result = "";
  172. if (!(((typeof(XMLHttpRequest) != 'undefined') && (typeof(XMLHttpRequest.prototype.sendAsBinary) != 'undefined')) || (typeof(Uint8Array) != 'undefined') ))
  173. result += "Browser doesn't support sending binary data\n";
  174. return result;
  175. },
  176. browserHasBinarySupport : function browserHasBinarySupport() {
  177. return RemObjects.UTIL.testBrowserBinary() == "";
  178. },
  179. showMessage : function(msg) {
  180. //for non-browser environments:
  181. //replace alert() call with something appropriate
  182. alert(msg);
  183. },
  184. showError : function showError(msg, e) {
  185. var result = "";
  186. if (e) {
  187. result += e.name + ": " + e.message;
  188. } else {
  189. result += msg.getErrorMessage() + "\n";
  190. };
  191. result += "\nCall stack:\n";
  192. var fn = showError;
  193. // if (!(fn.caller)) //possibly IE
  194. // fn = arguments.callee;
  195. // while((fn = fn.caller) !== null) {
  196. // var fnName = fn.toString().match(/^function\s*(\w+)\(/);
  197. // fnName = (fnName) ? fnName[1] : 'anonymous function';
  198. // result += fnName;
  199. // result += "\n";
  200. // }
  201. RemObjects.UTIL.showMessage(result);
  202. },
  203. toJSON : function toJSON(aValue) {
  204. if(typeof(JSON) != 'undefined') {
  205. var jsonString = JSON.stringify(aValue);
  206. jsonString = jsonString.replace(/[\u007F-\uFFFF]/g, function(chr) {
  207. return "\\u" + ("0000" + chr.charCodeAt(0).toString(16)).substr(-4)
  208. });
  209. return jsonString;
  210. } else {
  211. throw new Error("Your browser doesn't support JSON.stringify");
  212. };
  213. },
  214. parseJSON : function parseJSON(aValue) {
  215. if(typeof(JSON) != 'undefined') {
  216. return JSON.parse(aValue);
  217. } else {
  218. throw new Error("Your browser doesn't support JSON.parse");
  219. };
  220. },
  221. NewGuid : function NewGuid() {
  222. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,
  223. function(c) {
  224. var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
  225. return v.toString(16); })
  226. },
  227. GuidToArray : function GuidToArray(aGuid) {
  228. var result = [];
  229. aGuid = aGuid.replace(/-/g, "");
  230. for (var i = 3; i >= 0; result.push(parseInt(aGuid.substr(i-- * 2, 2), 16)));
  231. for (var i = 5; i >= 4; result.push(parseInt(aGuid.substr(i-- * 2, 2), 16)));
  232. for (var i = 7; i >= 6; result.push(parseInt(aGuid.substr(i-- * 2, 2), 16)));
  233. for (var i = 8; i < 16; result.push(parseInt(aGuid.substr(i++ * 2, 2), 16)));
  234. // for (var i = 0; i < 16; result.push(parseInt(aGuid.substr(i++ * 2, 2), 16)));
  235. return result;
  236. },
  237. guidToByteArray : function guidToByteArray(aGuid) {
  238. function readPart(str, start, end) {
  239. var result = "";
  240. for (var i = start; i <= end; result += String.fromCharCode(parseInt(aGuid.substr(i++ * 2 + 1, 2), 16)));
  241. return result;
  242. };
  243. function readPartReversed(str, start, end) {
  244. var result = "";
  245. for (var i = end; i >= start; result += String.fromCharCode(parseInt(aGuid.substr(i-- * 2 + 1, 2), 16)));
  246. return result;
  247. };
  248. aGuid = aGuid.replace(/-/g, "");
  249. return readPartReversed(aGuid, 0, 3) + readPartReversed(aGuid, 4, 5)
  250. + readPartReversed(aGuid, 6, 7) + readPart(aGuid, 8, 9) + readPart(aGuid, 10, 15);
  251. },
  252. zeroPad : function zeroPad(num, count) {
  253. var numZeropad = num + '';
  254. while (numZeropad.length < count) {
  255. numZeropad = "0" + numZeropad;
  256. }
  257. return numZeropad;
  258. },
  259. byteArrayToGuid : function byteArrayToGuid(byteArray) {
  260. function readPartReversed(str, start, end) {
  261. var result = "";
  262. for (var i = end; i >= start; i--) {
  263. result += RemObjects.UTIL.zeroPad((str.charCodeAt(i) & 0xFF).toString(16).toUpperCase(), 2);
  264. };
  265. return result;
  266. };
  267. function readPart(str, start, end) {
  268. var result = "";
  269. for (var i = start; i <= end; i++) {
  270. result += RemObjects.UTIL.zeroPad((str.charCodeAt(i) & 0xFF).toString(16).toUpperCase(), 2);
  271. };
  272. return result;
  273. };
  274. return "{" + readPartReversed(byteArray, 0, 3) + "-"
  275. + readPartReversed(byteArray, 4, 5) + "-"
  276. + readPartReversed(byteArray, 6, 7) + "-"
  277. + readPart(byteArray, 8, 9) + "-"
  278. + readPart(byteArray, 10, 15)
  279. + "}";
  280. },
  281. strToByteArray : function strToByteArray(str) {
  282. var byteArray = [];
  283. for (var i = 0; i < str.length; i++)
  284. if (str.charCodeAt(i) <= 0x7F)
  285. byteArray.push(str.substr(i, 1));
  286. else {
  287. var h = encodeURIComponent(str.charAt(i)).substr(1).split('%');
  288. for (var j = 0; j < h.length; j++)
  289. byteArray.push(String.fromCharCode(parseInt(h[j], 16)));
  290. };
  291. return byteArray.join("");
  292. },
  293. byteArrayToStr : function byteArrayToStr(byteArray) {
  294. var str = '';
  295. for (var i = 0; i < byteArray.length; i++)
  296. str += byteArray.charCodeAt(i) <= 0x7F ?
  297. byteArray.charCodeAt(i) === 0x25 ? "%25" : // %
  298. byteArray.substr(i, 1) :
  299. "%" + (byteArray.charCodeAt(i) & 0xFF).toString(16).toUpperCase();
  300. return decodeURIComponent(str);
  301. },
  302. byteArrayToUtf16 : function byteArrayToUtf16(byteArray) {
  303. var str = '';
  304. for (var i = 0; i < byteArray.length / 2; i++)
  305. str += String.fromCharCode((byteArray.charCodeAt(i * 2) & 0xFF) + ((byteArray.charCodeAt(i * 2 + 1) & 0xFF) << 8));
  306. return str;
  307. },
  308. utf16ToByteArray : function utf16ToByteArray(str) {
  309. var byteArray = "";
  310. for (var i = 0; i < str.length; i++) {
  311. byteArray += String.fromCharCode(str.charCodeAt(i) & 0xFF);
  312. byteArray += String.fromCharCode((str.charCodeAt(i) & 0xFF00) >> 8);
  313. };
  314. return byteArray;
  315. },
  316. ISO8601toDateTime : function ISO8601toDateTime(str) {
  317. var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
  318. "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
  319. "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
  320. var d = ("" + str).match(new RegExp(regexp));
  321. if (!d) return null;
  322. var offset = 0;
  323. var date = new Date(d[1], 0, 1);
  324. if (d[3]) { date.setMonth(d[3] - 1); }
  325. if (d[5]) { date.setDate(d[5]); }
  326. if (d[7]) { date.setHours(d[7]); }
  327. if (d[8]) { date.setMinutes(d[8]); }
  328. if (d[10]) { date.setSeconds(d[10]); }
  329. if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
  330. if (d[14]) {
  331. offset = (Number(d[16]) * 60) + Number(d[17]);
  332. offset *= ((d[15] == '-') ? 1 : -1);
  333. offset -= date.getTimezoneOffset();
  334. var time = (Number(date) + (offset * 60 * 1000));
  335. date.setTime(Number(time));
  336. }
  337. return date;
  338. },
  339. dateTimeToSOAPString : function dateTimeToSOAPString(aValue) {
  340. //'yyyy-mm-ddThh:nn:ss'
  341. return aValue.getFullYear() + '-' + RemObjects.UTIL.zeroPad(aValue.getMonth() + 1, 2)
  342. + '-' + RemObjects.UTIL.zeroPad(aValue.getDate(), 2)
  343. + 'T' + RemObjects.UTIL.zeroPad(aValue.getHours(), 2)
  344. + ':' + RemObjects.UTIL.zeroPad(aValue.getMinutes(), 2)
  345. + ':' + RemObjects.UTIL.zeroPad(aValue.getSeconds(), 2);
  346. },
  347. decimalToString : function decimalToString(aDecimal) { //aDecimal - array [0..6]
  348. var sign = (aDecimal[6] & 0x80000000) != 0;
  349. var scale = (aDecimal[6] & 0xFF0000) >> 16;
  350. var pos = 31;
  351. var aDec = aDecimal.slice();
  352. var aResult = [];
  353. var modres;
  354. var d;
  355. while ((aDec[0] != 0) || (aDec[1] != 0) || (aDec[2] != 0)
  356. || (aDec[3] != 0) || (aDec[4] != 0) || (aDec[5] != 0)
  357. || ((31 - pos) < scale)) {
  358. modres = 0;
  359. for (var i = 5; i >= 0; i--) {
  360. d = (modres << 16) | aDec[i];
  361. modres = d % 10;
  362. aDec[i] = Math.floor(d / 10);
  363. };
  364. aResult[pos] = modres.toString(10);
  365. pos--;
  366. if ((31 - pos) == scale) {
  367. aResult[pos] = ".";
  368. pos--;
  369. if ((aDec[0] == 0) && (aDec[1] == 0) && (aDec[2] == 0)) {
  370. aResult[pos] = '0';
  371. pos--;
  372. };
  373. };
  374. };
  375. if (pos == 31)
  376. return "0";
  377. if (sign) {
  378. aResult[pos] = '-';
  379. pos--;
  380. };
  381. return aResult.join("");
  382. },
  383. stringToDecimal : function stringToDecimal(aString) {
  384. var mulres;
  385. var d;
  386. var aRes = [0, 0, 0, 0, 0, 0, 0];
  387. var pos = 0;
  388. var scalepos = -1;
  389. var c;
  390. var n;
  391. for (var i = 1; i <= aString.length; i++) {
  392. mulres = 0;
  393. c = aString.substr(i - 1, 1);
  394. if (n = parseFloat(c)) {
  395. mulres = n
  396. } else if (c == "-") {
  397. aRes[6] = 0x80000000;
  398. continue;
  399. } else if (c == ".") {
  400. if (scalepos == -1)
  401. scalepos = pos;
  402. continue;
  403. } else
  404. continue;
  405. for (var j = 0; j < 6; j++) {
  406. d = aRes[j] * 10 + mulres;
  407. mulres = d >> 16;
  408. aRes[j] = d & 0xffff;
  409. };
  410. pos++;
  411. };
  412. if (scalepos != -1) {
  413. pos = pos - scalepos;
  414. aRes[6] = aRes[6] | (pos << 16);
  415. };
  416. return aRes;
  417. },
  418. toBase64 : function toBase64(aValue) {
  419. if (typeof(btoa) != 'undefined') {
  420. return btoa(aValue);
  421. } else {
  422. throw(new Error("Base64 encoding is not supported by your browser."));
  423. //return $.base64Encode(aValue);
  424. };
  425. },
  426. fromBase64 : function fromBase64 (aValue) {
  427. if (typeof(atob) != 'undefined') {
  428. return atob(aValue.replace(/(\n|\r)+/g, ""));
  429. } else {
  430. throw(new Error("Base64 decoding is not supported by your browser."));
  431. // return $.base64Decode(aValue);
  432. };
  433. },
  434. checkArgumentTypes : function checkArgumentTypes (args, types) {
  435. for (var i = 0; i < types.length; i++) {
  436. if (typeof(types[i]) == "string") {
  437. if (typeof(args[i]) != types[i]) return false;
  438. } else {
  439. if (!(args[i] instanceof types[i])) return false;
  440. };
  441. };
  442. return true;
  443. }
  444. };
  445. RemObjects.SDK.Enum.MessageType = {
  446. mtMessage : 0,
  447. mtException : 1,
  448. mtEvent : 2,
  449. mtPoll : 0x80,
  450. mtPollResponse : 0x81
  451. };
  452. //RO.SDK implementation
  453. RemObjects.SDK.ROEventSink.prototype = new RemObjects.SDK.ROComplexType();
  454. RemObjects.SDK.ROEventSink.prototype.constructor = RemObjects.SDK.ROEventSink;
  455. RemObjects.SDK.ROEventSink.prototype.readEvent = function readEvent(aMessage, aName) {
  456. for (var prop in this[aName]) {
  457. if ((typeof this[aName][prop]) != "function") {
  458. this[aName][prop].value = aMessage.read(prop, this[aName][prop].dataType);
  459. };
  460. };
  461. };
  462. RemObjects.SDK.ROException.prototype = new Error();
  463. RemObjects.SDK.ROEnumType.prototype = new RemObjects.SDK.ROComplexType();
  464. RemObjects.SDK.ROEnumType.prototype.constructor = RemObjects.SDK.ROEnumType;
  465. RemObjects.SDK.ROEnumType.prototype.writeTo = function writeTo(aMessage) {
  466. aMessage.write("", "Integer", this.enumValues.indexOf(this.value));
  467. };
  468. RemObjects.SDK.ROEnumType.prototype.readFrom = function readFrom(aMessage) {
  469. this.value = this.enumValues[aMessage.read("", "Integer")];
  470. };
  471. RemObjects.SDK.ROEnumType.prototype.toObject = function toObject() {
  472. return this.value;
  473. };
  474. RemObjects.SDK.ROEnumType.prototype.fromObject = function fromObject(aValue) {
  475. this.value = aValue; //todo: add check
  476. };
  477. RemObjects.SDK.ROStructType.prototype = new RemObjects.SDK.ROComplexType();
  478. RemObjects.SDK.ROStructType.prototype.constructor = RemObjects.SDK.ROStructType;
  479. RemObjects.SDK.ROStructType.prototype.writeTo = function writeTo(aMessage) {
  480. for (var prop in this) {
  481. if ((typeof this[prop]) != "function") {
  482. aMessage.write(prop, this[prop].dataType, this[prop].value);
  483. };
  484. };
  485. };
  486. RemObjects.SDK.ROStructType.prototype.readFrom = function readFrom(aMessage) {
  487. for (var prop in this) {
  488. if ((typeof this[prop]) != "function") {
  489. this[prop].value = aMessage.read(prop, this[prop].dataType);
  490. };
  491. };
  492. };
  493. RemObjects.SDK.ROStructType.prototype.toObject = function toObject(aStoreType) {
  494. var result = {};
  495. for (var prop in this) {
  496. if ((typeof this[prop]) != "function") {
  497. if (this[prop].value instanceof RemObjects.SDK.ROComplexType) {
  498. result[prop] = this[prop].value.toObject(aStoreType);
  499. } else
  500. result[prop] = this[prop].value;
  501. };
  502. };
  503. if(aStoreType) result.__type = /function\s*(.*?)\(/.exec(this.constructor.toString())[1];
  504. return result;
  505. };
  506. RemObjects.SDK.ROStructType.prototype.fromObject = function fromObject(aValue) {
  507. for (var prop in this) {
  508. if ((typeof this[prop]) != "function") { //!!!
  509. if (RemObjects.SDK.RTTI[this[prop].dataType] && RemObjects.SDK.RTTI[this[prop].dataType].prototype instanceof RemObjects.SDK.ROComplexType) {
  510. this[prop].value = new RemObjects.SDK.RTTI[this[prop].dataType]();
  511. this[prop].value.fromObject(aValue[prop]);
  512. } else {
  513. if (this[prop].dataType == "DateTime") {
  514. this[prop].value = RemObjects.UTIL.ISO8601toDateTime(aValue[prop]);
  515. } else {
  516. this[prop].value = aValue[prop];
  517. };
  518. };
  519. };
  520. };
  521. return this;
  522. };
  523. RemObjects.SDK.ROArrayType.prototype = new RemObjects.SDK.ROComplexType();
  524. RemObjects.SDK.ROArrayType.prototype.constructor = RemObjects.SDK.ROArrayType;
  525. RemObjects.SDK.ROArrayType.prototype.writeTo = function writeTo(aMessage) {
  526. for (var i=0; i<this.items.length; i++ ) {
  527. var constructorName = /function\s*(.*?)\(/.exec(this.items[i].constructor.toString())[1];
  528. aMessage.write("", RemObjects.SDK.RTTI[constructorName] ? constructorName : this.elementType, this.items[i]);
  529. };
  530. };
  531. RemObjects.SDK.ROArrayType.prototype.readFrom = function readFrom(aMessage) {
  532. for (var i=0; i<this.items.length; i++ ) {
  533. this.items[i] = aMessage.read("", this.elementType);
  534. };
  535. };
  536. RemObjects.SDK.ROArrayType.prototype.toObject = function toObject(aStoreType) {
  537. var result = [];
  538. for (var i = 0; i < this.items.length; i++)
  539. if (this.items[i] instanceof RemObjects.SDK.ROComplexType) {
  540. var tmp = this.items[i].toObject(aStoreType);
  541. if(aStoreType) tmp.__type = /function\s*(.*?)\(/.exec(this.items[i].constructor.toString())[1];
  542. result.push(tmp);
  543. } else
  544. result.push(this.items[i]);
  545. return result;
  546. };
  547. RemObjects.SDK.ROArrayType.prototype.fromObject = function fromObject(aValue) {
  548. if (!aValue) return this;
  549. var itemType = RemObjects.SDK.RTTI[this.elementType];
  550. if(itemType) {
  551. for (var i = 0; i < aValue.length; i++) {
  552. var item = new itemType();
  553. item.fromObject(aValue[i]);
  554. this.items.push(item);
  555. };
  556. } else {
  557. if (this.elementType == "DateTime") {
  558. for (var i = 0; i < aValue.length; i++) {
  559. this.items.push(RemObjects.UTIL.ISO8601toDateTime(aValue[i]));
  560. };
  561. } else {
  562. this.items = aValue;
  563. };
  564. };
  565. return this;
  566. };
  567. RemObjects.SDK.ROService.prototype.getChannel = function getChannel() {
  568. return this.fChannel;
  569. };
  570. RemObjects.SDK.ROService.prototype.getMessage = function getMessage() {
  571. return this.fMessage;
  572. };
  573. RemObjects.SDK.ROService.prototype.getServiceName = function getServiceName() {
  574. return this.fServiceName;
  575. };
  576. RemObjects.SDK.ClientChannel.prototype.dispatch = function dispatch(aMessage, onSuccessFunction, onErrorFunction) {
  577. function handleException(e) {
  578. if (((e.name == "EROSessionNotFound") || (e.name == "SessionNotFoundException")) && !(that.retrying)) {
  579. if (that.onLoginNeeded) {
  580. that.onLoginNeeded(function() {
  581. that.retrying = true;
  582. that.dispatch(aMessage, function(__msg) {
  583. that.retrying = false;
  584. onSuccessFunction(__msg)
  585. },
  586. function(__msg, __e) {
  587. that.retrying = false;
  588. onErrorFunction(__msg, __e);
  589. });
  590. });
  591. };
  592. } else {
  593. // if (window[e.name] && window[e.name].prototype instanceof RemObjects.SDK.ROException) {
  594. if (RemObjects.SDK.RTTI[e.name] && RemObjects.SDK.RTTI[e.name].prototype instanceof RemObjects.SDK.ROException) {
  595. e = new RemObjects.SDK.RTTI[e.name](e);
  596. e.fields.readFrom(aMessage);
  597. };
  598. if (onErrorFunction)
  599. onErrorFunction(aMessage, e);
  600. };
  601. };
  602. var that = this;
  603. this.post(aMessage.requestStream(), aMessage instanceof RemObjects.SDK.BinMessage, function ajax_post_success(__response) {
  604. try {
  605. aMessage.setResponseStream(__response);
  606. if (onSuccessFunction)
  607. onSuccessFunction(aMessage);
  608. } catch (e) {
  609. handleException(e);
  610. };
  611. }, function ajax_post_error(__response, __status) {
  612. aMessage.setErrorResponse("AJAX status: " + __status + "\nResponse: " +__response);
  613. try {
  614. if (__response)
  615. aMessage.setResponseStream(__response);
  616. if (that.onAjaxError) that.onAjaxError(__response, __status);
  617. if (onErrorFunction) onErrorFunction(aMessage);
  618. } catch (e) {
  619. handleException(e);
  620. };
  621. });
  622. };
  623. RemObjects.SDK.ClientChannel.prototype.onLoginNeeded = function onLoginNeeded(aCallback) {
  624. RemObjects.UTIL.showMessage("Default onLoginNeeded handler: assign channel.onLoginNeeded and call aCallback there after successful login");
  625. aCallback();
  626. };
  627. RemObjects.SDK.HTTPClientChannel.prototype = new RemObjects.SDK.ClientChannel("");
  628. RemObjects.SDK.HTTPClientChannel.prototype.constructor = RemObjects.SDK.HTTPClientChannel;
  629. RemObjects.SDK.HTTPClientChannel.prototype.post = function post(aMessage, isBinary, onSuccess, onError) {
  630. var ajaxObject;
  631. if ((typeof(Ti) != 'undefined') && (typeof(Ti.Network) != 'undefined')) {
  632. ajaxObject = new TitaniumAjaxWrapper(this.url);
  633. } else {
  634. ajaxObject = new AjaxWrapper(this.url);
  635. };
  636. ajaxObject.post(aMessage, isBinary, onSuccess, onError);
  637. };
  638. RemObjects.SDK.Message.prototype.clone = function clone() {
  639. var cloned = new this.constructor();
  640. cloned.fClientID = this.fClientID;
  641. return cloned;
  642. };
  643. RemObjects.SDK.Message.prototype.getClientID = function getClientID() {
  644. return this.fClientID;
  645. };
  646. RemObjects.SDK.Message.prototype.setClientID = function setClientID(aValue) {
  647. this.fClientID = aValue;
  648. };
  649. RemObjects.SDK.Message.prototype.setErrorResponse = function setErrorResponse(aResponse) {
  650. this.fResponseObject.error = {message: aResponse};
  651. };
  652. RemObjects.SDK.Message.prototype.getErrorMessage = function getErrorMessage() {
  653. if (this.fResponseObject.error)
  654. return this.fResponseObject.error.message;
  655. else
  656. return "";
  657. };
  658. RemObjects.SDK.BinHeader.prototype.asStream = function asStream() {
  659. var result = "";
  660. var parser = new BinaryParser();
  661. for (var i = 0; i < 0x1c; i++)
  662. result += parser.encodeInt(this.fHeader[i], 8, false);
  663. return result;
  664. };
  665. RemObjects.SDK.BinHeader.prototype.readFrom = function readFrom(aStream) {
  666. var parser = new BinaryParser();
  667. for (var i = 0; i < 0x1c; i++)
  668. this.fHeader[i] = parser.decodeInt(aStream.substr(i, 1), 8, false);
  669. };
  670. RemObjects.SDK.BinHeader.prototype.isValidHeader = function isValidHeader() {
  671. var tmp = "";
  672. for (var i = 0; i < 5; tmp+=String.fromCharCode(this.fHeader[i++]));
  673. return (tmp == "RO107");
  674. };
  675. RemObjects.SDK.BinHeader.prototype.getCompressed = function getCompressed() {
  676. return this.fHeader[5];
  677. };
  678. RemObjects.SDK.BinHeader.prototype.setCompressed = function setCompressed(aValue) {
  679. this.fHeader[5] = aValue ? 1 : 0;
  680. };
  681. RemObjects.SDK.BinHeader.prototype.getMessageType = function getMessageType() {
  682. return this.fHeader[6];
  683. };
  684. RemObjects.SDK.BinHeader.prototype.setMessageType = function setMessageType(aValue) {
  685. this.fHeader[6] = aValue;
  686. };
  687. RemObjects.SDK.BinHeader.prototype.setClientID = function setClientID(aValue) {
  688. var guid = RemObjects.UTIL.GuidToArray(aValue);
  689. this.fHeader.length -= 16;
  690. this.fHeader = this.fHeader.concat(guid);
  691. };
  692. RemObjects.SDK.BinMessage.prototype = new RemObjects.SDK.Message();
  693. RemObjects.SDK.BinMessage.prototype.constructor = RemObjects.SDK.BinMessage;
  694. RemObjects.SDK.BinMessage.prototype.initialize = function initialize(aServiceName, aMethodName, aMessageType) {
  695. var header = new RemObjects.SDK.BinHeader();
  696. header.setCompressed(false);
  697. header.setMessageType(aMessageType || RemObjects.SDK.Enum.MessageType.mtMessage);
  698. header.setClientID(this.fClientID);
  699. this.fRequestObject = header.asStream();
  700. this.parser = new BinaryParser();
  701. if (aMessageType != RemObjects.SDK.Enum.MessageType.mtPoll) {
  702. this.fRequestObject += this.parser.encodeInt(aServiceName.length, 32, false) + aServiceName;
  703. this.fRequestObject += this.parser.encodeInt(aMethodName.length, 32, false) + aMethodName;
  704. };
  705. };
  706. RemObjects.SDK.BinMessage.prototype.finalize = function finalize() {
  707. };
  708. RemObjects.SDK.BinMessage.prototype.write = function write(aName, aType, aValue) {
  709. if (RemObjects.SDK.RTTI[aType]) {
  710. if (aValue instanceof RemObjects.SDK.ROComplexType) { //not null
  711. if (!(aValue instanceof RemObjects.SDK.ROEnumType)) {
  712. this.fRequestObject += this.parser.encodeInt(1, 8, false);
  713. if (aValue instanceof RemObjects.SDK.ROStructType)
  714. this.writeStrWithLength(aType);
  715. if (aValue instanceof RemObjects.SDK.ROArrayType)
  716. this.fRequestObject += this.parser.encodeInt(aValue.items.length, 32, false);
  717. };
  718. aValue.writeTo(this);
  719. } else { //null
  720. if (!(RemObjects.SDK.RTTI[aType].prototype instanceof RemObjects.SDK.ROEnumType)) {
  721. this.fRequestObject += this.parser.encodeInt(0, 8, false);
  722. if (RemObjects.SDK.RTTI[aType].prototype instanceof RemObjects.SDK.ROStructType)
  723. this.writeStrWithLength(aType);
  724. };
  725. };
  726. } else
  727. switch (aType) {
  728. case "Decimal":
  729. var decimal = RemObjects.UTIL.stringToDecimal(aValue.toString());
  730. for (var i = 0; i < 6; i++)
  731. this.fRequestObject += this.parser.encodeInt(decimal[i], 16, false);
  732. this.fRequestObject += this.parser.encodeInt(decimal[6], 32, false);
  733. break;
  734. case "Double":
  735. this.fRequestObject += this.parser.encodeFloat(aValue, 52, 11);
  736. break;
  737. case "Boolean":
  738. this.fRequestObject += this.parser.encodeInt((aValue ? 1 : 0), 32, false);
  739. break;
  740. case "Binary":
  741. this.fRequestObject += this.parser.encodeInt(1, 8, false);
  742. this.writeStrWithLength(aValue);
  743. break;
  744. case "Integer":
  745. this.fRequestObject += this.parser.encodeInt(aValue, 32, true);
  746. break;
  747. case "Int64":
  748. this.fRequestObject += this.parser.encodeInt(aValue, 64, true);
  749. break;
  750. case "Currency":
  751. var cur = this.parser.encodeInt(aValue * 10000, 48, true);
  752. this.fRequestObject += cur;
  753. if ((cur.charCodeAt(cur.length - 1) == 0) || (cur.charCodeAt(cur.length - 1) == 0xFF)) {
  754. this.fRequestObject += cur.substr(cur.length - 1, 1) + cur.substr(cur.length - 1, 1);
  755. };
  756. break;
  757. case "Guid":
  758. this.fRequestObject += RemObjects.UTIL.guidToByteArray(aValue);
  759. break;
  760. case "DateTime":
  761. this.fRequestObject += this.parser.encodeFloat((aValue - aValue.getTimezoneOffset() * 60000) / 86400000 + 25569.0, 52, 11);
  762. break;
  763. case "WideString":
  764. this.fRequestObject += this.parser.encodeInt(aValue.length, 32, true);
  765. this.fRequestObject += RemObjects.UTIL.utf16ToByteArray(aValue);
  766. break;
  767. case "Xml":
  768. case "Utf8String":
  769. aValue = RemObjects.UTIL.strToByteArray(aValue);
  770. case "AnsiString":
  771. this.writeStrWithLength(aValue);
  772. break;
  773. case "Variant":
  774. this.writeVariant(aValue);
  775. break;
  776. default:
  777. throw new Error("BinMessage.write: Unknown type of " + aName + " - " + aType);
  778. };
  779. };
  780. RemObjects.SDK.BinMessage.prototype.writeVariant = function writeVariant(aValue) {
  781. var tmpValue;
  782. var tmpInt;
  783. var tmpFloat;
  784. if ((aValue == undefined) || (aValue == null)) {
  785. this.writeInteger(0x0001); //varNull
  786. } else if (aValue instanceof Date) {
  787. this.writeInteger(0x0007); //varDateTime
  788. this.write("", "DateTime", aValue);
  789. } else if (typeof(aValue) == "boolean") {
  790. this.writeInteger(0x000B); //varBoolean
  791. this.write("", "Boolean", aValue);
  792. } else if(!isNaN(aValue) && typeof (aValue) != "string") {
  793. if((tmpInt = parseInt(aValue)) == (tmpFloat = parseFloat(aValue))) {
  794. this.writeInteger(0x0003); //varInt32
  795. this.write("", "Integer", tmpInt);
  796. } else {
  797. this.writeInteger(0x0005); //varDouble
  798. this.write("", "Double", tmpFloat);
  799. };
  800. } else if (typeof(aValue) == "string") {
  801. this.writeInteger(0x0008); //varString
  802. this.write("", "Utf8String", aValue);
  803. } else if (aValue.length) {
  804. this.writeInteger(0x200C); //varVariant
  805. this.writeInteger(0); //lowBound
  806. this.writeInteger(aValue.length - 1); //highBound
  807. for (var i = 0; i < aValue.length; i++)
  808. this.writeVariant(aValue[i]);
  809. } else throw new Error("writeVariant: unknown type")
  810. };
  811. RemObjects.SDK.BinMessage.prototype.writeInteger = function writeVariant(aValue) {
  812. this.fRequestObject += this.parser.encodeInt(aValue, 32, true);
  813. };
  814. RemObjects.SDK.BinMessage.prototype.writeStrWithLength = function writeStrWithLength(aValue) {
  815. this.fRequestObject += this.parser.encodeInt(aValue.length, 32, false) + aValue;
  816. };
  817. RemObjects.SDK.BinMessage.prototype.readByte = function readByte() {
  818. var result = -1;
  819. if (this.fStreamPos < this.fResponseString.length) {
  820. result = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 1), 8, false) & 0xFF;
  821. this.fStreamPos += 1;
  822. };
  823. return result;
  824. };
  825. RemObjects.SDK.BinMessage.prototype.readCompressed = function readCompressed() {
  826. var result = "";
  827. var b, inflator = new RemObjects.ZLIB.Inflator(this);
  828. this.fStreamPos += 2;
  829. while ((b = inflator.readByte()) >= 0) {
  830. result += String.fromCharCode(b);
  831. };
  832. return result;
  833. };
  834. RemObjects.SDK.BinMessage.prototype.read = function read(valueName, valueType) {
  835. var value;
  836. var rttiType = RemObjects.SDK.RTTI[valueType];
  837. if (rttiType && rttiType.prototype instanceof RemObjects.SDK.ROComplexType) {
  838. if (rttiType.prototype instanceof RemObjects.SDK.ROEnumType) {
  839. value = new rttiType();
  840. value.readFrom(this);
  841. return value;
  842. };
  843. if (!(this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos++, 1), 8, false))) { // Not assigned
  844. return null;
  845. };
  846. if (rttiType.prototype instanceof RemObjects.SDK.ROStructType) {
  847. var realType = this.read("", "AnsiString");
  848. if (valueType !== realType) {
  849. value = new RemObjects.SDK.RTTI[realType]();
  850. } else {
  851. value = new rttiType();
  852. };
  853. value.readFrom(this);
  854. return value;
  855. }
  856. value = new rttiType();
  857. if (value instanceof RemObjects.SDK.ROArrayType) {
  858. value.items.length = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false);
  859. this.fStreamPos += 4;
  860. };
  861. value.readFrom(this);
  862. return value;
  863. }
  864. switch (valueType) {
  865. case "Decimal":
  866. var decimal = [];
  867. for (var i = 0; i < 6; i++) {
  868. decimal[i] = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 2), 16, false);
  869. this.fStreamPos += 2;
  870. };
  871. decimal[6] = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false);
  872. this.fStreamPos += 4;
  873. value = parseFloat(RemObjects.UTIL.decimalToString(decimal));
  874. break;
  875. case "Double":
  876. value = this.parser.decodeFloat(this.fResponseString.substr(this.fStreamPos, 8), 52, 11);
  877. this.fStreamPos += 8;
  878. this.fResponseObject[valueName] = value;
  879. break;
  880. case "DateTime":
  881. var utcValue = this.parser.decodeFloat(this.fResponseString.substr(this.fStreamPos, 8), 52, 11);
  882. utcValue = new Date(Math.round((utcValue - 25569.0) * 86400000));
  883. value = new Date(utcValue.getUTCFullYear(), utcValue.getUTCMonth(), utcValue.getUTCDate(), utcValue.getUTCHours(), utcValue.getUTCMinutes(), utcValue.getUTCSeconds());
  884. this.fStreamPos += 8;
  885. this.fResponseObject[valueName] = value;
  886. break;
  887. case "Boolean":
  888. value = !(this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false) == 0);
  889. this.fStreamPos += 4;
  890. this.fResponseObject[valueName] = value;
  891. break;
  892. case "Integer":
  893. value = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, true);
  894. this.fStreamPos += 4;
  895. this.fResponseObject[valueName] = value;
  896. break;
  897. case "Int64":
  898. value = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 6), 48, true);
  899. this.fStreamPos += 8;
  900. this.fResponseObject[valueName] = value;
  901. break;
  902. case "Currency":
  903. value = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 6), 48, true) / 10000;
  904. this.fStreamPos += 8;
  905. this.fResponseObject[valueName] = value;
  906. break;
  907. case "Xml":
  908. case "Utf8String":
  909. var len = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false);
  910. this.fStreamPos += 4;
  911. value = RemObjects.UTIL.byteArrayToStr(this.fResponseString.substr(this.fStreamPos, len));
  912. this.fStreamPos += len;
  913. break;
  914. case "WideString":
  915. var len = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false);
  916. this.fStreamPos += 4;
  917. value = RemObjects.UTIL.byteArrayToUtf16(this.fResponseString.substr(this.fStreamPos, len * 2));
  918. this.fStreamPos += len * 2;
  919. break;
  920. case "Binary":
  921. var isAssigned = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 1), 8, false);
  922. this.fStreamPos += 1;
  923. if (isAssigned == 0) {
  924. value = null;
  925. break;
  926. };
  927. var len = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false);
  928. this.fStreamPos += 4;
  929. value = "";
  930. for (var i = this.fStreamPos; i < this.fStreamPos + len; i++) {
  931. value += String.fromCharCode(this.fResponseString.charCodeAt(i) & 0xFF);
  932. };
  933. this.fStreamPos += len;
  934. break;
  935. case "AnsiString":
  936. var len = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false);
  937. this.fStreamPos += 4;
  938. value = this.fResponseString.substr(this.fStreamPos, len);
  939. this.fStreamPos += len;
  940. break;
  941. case "Guid":
  942. value = RemObjects.UTIL.byteArrayToGuid(this.fResponseString.substr(this.fStreamPos, 16));
  943. this.fStreamPos += 16;
  944. break;
  945. case "Variant":
  946. value = this.readVariant();
  947. break;
  948. default:
  949. if (RemObjects.SDK.RTTI[valueType] && (typeof(RemObjects.SDK.RTTI[valueType]) == "function") && (RemObjects.SDK.RTTI[valueType].prototype instanceof RemObjects.SDK.ROComplexType)) {
  950. value = new RemObjects.SDK.RTTI[valueType]();
  951. value.readFrom(this);
  952. } else {
  953. this.fResponseObject.error = {message : "BinMessage.read: Unknown type of " + valueName + " - " + valueType};
  954. throw new Error(this.fResponseObject.error.message);
  955. };
  956. };
  957. return value;
  958. };
  959. RemObjects.SDK.BinMessage.prototype.readVariant = function readVariant() {
  960. var code = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false);
  961. this.fStreamPos += 4;
  962. var result;
  963. if ((code & 0x2000) == 0x2000) {
  964. if (code == 0x2011) { //varBinary
  965. var binLength = this.read("", "Integer");
  966. result = this.fResponseString.substr(this.fStreamPos, binLength);
  967. this.fStreamPos += binLength;
  968. } else {//varArray
  969. //var itemCode = code & 0xFFF;
  970. result = [];
  971. var lowBound = this.read("", "Integer");
  972. var highBound = this.read("", "Integer");
  973. for (var i = lowBound; i <= highBound; i++)
  974. result[i] = this.readVariant();
  975. };
  976. return result;
  977. };
  978. switch(code) {
  979. case 0x000A: //varError
  980. case 0x0000: return undefined; //varEmpty
  981. case 0x0001: return null; //varNull
  982. case 0x0002: //varInt16
  983. result = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 2), 16, true);
  984. this.fStreamPos += 2;
  985. return result;
  986. case 0x0003: //varInt32
  987. result = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, true);
  988. this.fStreamPos += 4;
  989. return result;
  990. case 0x0004: //varSingle
  991. result = this.parser.decodeFloat(this.fResponseString.substr(this.fStreamPos, 4), 23, 8);
  992. this.fStreamPos += 4;
  993. return result;
  994. case 0x0005: return this.read("", "Double");//varDouble
  995. case 0x0006: return this.read("", "Currency");//varCurrency
  996. case 0x0007: return this.read("", "DateTime");//varDateTime
  997. //varDispatch = 0x0009
  998. case 0x000B: return this.read("", "Boolean");//varBoolean
  999. //varVariant = 0x000C
  1000. //varUnknown = 0x000D
  1001. case 0x000E: return this.read("", "Decimal");//varDecimal
  1002. case 0x0010: //varInt8
  1003. result = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 1), 8, true);
  1004. this.fStreamPos += 1;
  1005. return result;
  1006. case 0x0011: //varByte
  1007. result = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 1), 8, false);
  1008. this.fStreamPos += 1;
  1009. return result;
  1010. case 0x0012: //varWord
  1011. result = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 2), 16, false);
  1012. this.fStreamPos += 2;
  1013. return result;
  1014. case 0x0013: //varLongWord
  1015. result = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false);
  1016. this.fStreamPos += 4;
  1017. return result;
  1018. case 0x0014: //varInt64
  1019. result = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 8), 48, true);
  1020. this.fStreamPos += 8;
  1021. return result;
  1022. case 0x0072: return this.read("", "Guid");//varGuid
  1023. case 0x0100: return this.read("", "AnsiString");//varDelphiString
  1024. case 0x0008: //varOleStr
  1025. case 0x0102: return this.read("", "Utf8String");//varDelphiUtfString
  1026. default : throw new Error("readVariant: unknown varCode 0x" + code.toString(16));
  1027. };
  1028. };
  1029. RemObjects.SDK.BinMessage.prototype.requestStream = function requestStream() {
  1030. return this.fRequestObject;
  1031. };
  1032. RemObjects.SDK.BinMessage.prototype.setResponseStream = function setResponseStream(aResponse) {
  1033. this.fResponseString = aResponse;
  1034. var header = new RemObjects.SDK.BinHeader();
  1035. header.readFrom(this.fResponseString.substr(0, 28));
  1036. this.fStreamPos = 28; //skip header
  1037. if (!header.isValidHeader()) {
  1038. this.fResponseObject.error = {message : "Invalid response: unsupported binary message signature"};
  1039. throw new Error(this.fResponseObject.error.message);
  1040. };
  1041. if (header.getCompressed()) {
  1042. this.fResponseString = this.readCompressed();
  1043. this.fStreamPos = 0;
  1044. //this.fResponseObject.error = {message : "Invalid response: compression is not supported for binary message"};
  1045. //throw new Error(this.fResponseObject.error.message);
  1046. };
  1047. switch (header.getMessageType()) {
  1048. case RemObjects.SDK.Enum.MessageType.mtMessage :
  1049. var value = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false);
  1050. this.fStreamPos += 4 + value; //skip service name
  1051. value = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false);
  1052. this.fStreamPos += 4 + value; //skip method name
  1053. break;
  1054. case RemObjects.SDK.Enum.MessageType.mtException :
  1055. var value = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false);
  1056. var exceptionClass = this.fResponseString.substr(this.fStreamPos + 4, value);
  1057. this.fStreamPos += 4 + value;
  1058. value = this.parser.decodeInt(this.fResponseString.substr(this.fStreamPos, 4), 32, false);
  1059. var exceptionMessage = this.fResponseString.substr(this.fStreamPos + 4, value);
  1060. this.fStreamPos += 4 + value; //skip method name
  1061. this.fResponseObject.error = {message : exceptionClass + ":\n" + exceptionMessage};
  1062. var __e = new Error(exceptionMessage);
  1063. __e.name = exceptionClass;
  1064. throw __e;
  1065. break;
  1066. case RemObjects.SDK.Enum.MessageType.mtPollResponse :
  1067. case RemObjects.SDK.Enum.MessageType.mtEvent :
  1068. break;
  1069. default:
  1070. throw new Error("Unsupported binary message type - 0x" + header.getMessageType().toString(16));
  1071. };
  1072. };
  1073. RemObjects.SDK.JSONMessage.prototype = new RemObjects.SDK.Message();
  1074. RemObjects.SDK.JSONMessage.prototype.constructor = RemObjects.SDK.JSONMessage;
  1075. RemObjects.SDK.JSONMessage.prototype.initialize = function initialize(aServiceName, aMethodName, aMessageType) {
  1076. this.fRequestObject.id = "{" + this.fClientID + "}";
  1077. this.fRequestObject.method = aServiceName + "." + aMethodName;
  1078. this.fRequestObject.params = {};
  1079. if (aMessageType) this.fRequestObject.type = aMessageType;
  1080. };
  1081. RemObjects.SDK.JSONMessage.prototype.finalize = function finalize() {
  1082. };
  1083. RemObjects.SDK.JSONMessage.prototype.write = function write(aName, aType, aValue) {
  1084. if (aValue instanceof RemObjects.SDK.ROComplexType) {
  1085. this.fRequestObject.params[aName] = aValue.toObject(true);
  1086. } else if (aValue instanceof Date) {
  1087. this.fRequestObject.params[aName] = RemObjects.UTIL.dateTimeToSOAPString(aValue);
  1088. } else if (aType == "Binary") {
  1089. this.fRequestObject.params[aName] = RemObjects.UTIL.toBase64(aValue);
  1090. } else {
  1091. this.fRequestObject.params[aName] = aValue;
  1092. };
  1093. };
  1094. RemObjects.SDK.JSONMessage.prototype.read = function read(aName, aType) {
  1095. if (this.fResponseObject.result == undefined) {
  1096. throw new Error("JSONMessage.read: result property is missing:\n" + RemObjects.UTIL.toJSON(this.fResponseObject));
  1097. };
  1098. if (this.fResponseObject.result[aName] == undefined) {
  1099. throw new Error("JSONMessage.read error:\n" + aName + ":" + aType + " is missing.");
  1100. };
  1101. var result;
  1102. aType = this.fResponseObject.result[aName].__type || aType;
  1103. if (RemObjects.SDK.RTTI[aType] && RemObjects.SDK.RTTI[aType].prototype instanceof RemObjects.SDK.ROComplexType) {
  1104. result = new RemObjects.SDK.RTTI[aType]();
  1105. if (RemObjects.SDK.RTTI[aType].prototype instanceof RemObjects.SDK.ROEnumType) {
  1106. result.value = this.fResponseObject.result[aName];
  1107. } else {
  1108. result.fromObject(this.fResponseObject.result[aName]);
  1109. };
  1110. } else if ((aType == "DateTime") || ((aType == "Variant") && (RemObjects.UTIL.ISO8601toDateTime(this.fResponseObject.result[aName])))) {
  1111. result = RemObjects.UTIL.ISO8601toDateTime(this.fResponseObject.result[aName]);
  1112. } else {
  1113. result = this.fResponseObject.result[aName];
  1114. };
  1115. return result;
  1116. };
  1117. RemObjects.SDK.JSONMessage.prototype.requestStream = function requestStream() {
  1118. return RemObjects.UTIL.toJSON(this.fRequestObject);
  1119. };
  1120. RemObjects.SDK.JSONMessage.prototype.setResponseStream = function setResponseStream(aResponse) {
  1121. try {
  1122. this.fResponseObject = RemObjects.UTIL.parseJSON(aResponse);
  1123. } catch (e) {
  1124. throw new Error("JSONMessage.setResponseStream:\n JSON parsing error: " + e.message + "\nServer response:\n" + aResponse);
  1125. };
  1126. if (this.fResponseObject.error) {
  1127. var __e;
  1128. __e = new Error(this.fResponseObject.error.message);
  1129. if (this.fResponseObject.error.name == "ROJSONException") {
  1130. __e.name = this.fResponseObject.error.roexception.type;
  1131. } else {
  1132. __e.name = this.fResponseObject.error.name;
  1133. };
  1134. throw __e;
  1135. };
  1136. if (!this.fResponseObject.result) {
  1137. this.fResponseObject.result = this.fResponseObject.params;
  1138. };
  1139. };
  1140. RemObjects.SDK.EventReceiver.prototype.addHandler = function addHandler(anEventName, aCallback) {
  1141. this.fHandlers[anEventName] = aCallback;
  1142. };
  1143. RemObjects.SDK.EventReceiver.prototype.setActive = function setActive(aValue) {
  1144. this.fActive = aValue;
  1145. if (this.fActive) {
  1146. var that = this;
  1147. this.fInterval = setInterval(function () {that.intPollServer();}, this.fTimeout);
  1148. } else {
  1149. clearInterval(this.fInterval);
  1150. };
  1151. };
  1152. RemObjects.SDK.EventReceiver.prototype.getActive = function getActive() {
  1153. return this.fActive;
  1154. };
  1155. RemObjects.SDK.EventReceiver.prototype.getTimeout = function getTimeout() {
  1156. return this.fTimeout;
  1157. };
  1158. RemObjects.SDK.EventReceiver.prototype.setTimeout = function setTimeout(aValue) {
  1159. this.fTimeout = aValue;
  1160. if (this.fActive) {
  1161. this.setActive(false);
  1162. this.setActive(true);
  1163. };
  1164. };
  1165. RemObjects.SDK.EventReceiver.prototype.intPollServer = function intPollServer() {
  1166. try {
  1167. var that = this;
  1168. var msg = this.fMessage.clone();
  1169. msg.initialize(this.fServiceName, "poll", RemObjects.SDK.Enum.MessageType.mtPoll);
  1170. msg.write("MaxMessageCount", "Integer", 10);
  1171. if (msg instanceof RemObjects.SDK.BinMessage) {
  1172. msg.write("", "Guid", msg.getClientID());
  1173. };
  1174. msg.finalize();
  1175. this.fChannel.dispatch(msg, function (__message) {
  1176. var msgCount = __message.read("MessageCount", "Integer");
  1177. var msgLeft = __message.read("MessagesLeft", "Integer");
  1178. for (var i = 0; i < msgCount; i++) {
  1179. var events = __message.clone();
  1180. events.initialize("", "", RemObjects.SDK.Enum.MessageType.mtPollResponse);
  1181. var eventsStream = __message.read("Message_" + i, "Binary");
  1182. if (__message instanceof RemObjects.SDK.JSONMessage) {
  1183. eventsStream = RemObjects.UTIL.fromBase64(eventsStream);
  1184. };
  1185. events.setResponseStream(eventsStream);
  1186. var sinkName = events.read("InterfaceName", "AnsiString");
  1187. var eventName = events.read("MessageName", "AnsiString");
  1188. if (RemObjects.SDK.RTTI[sinkName] && RemObjects.SDK.RTTI[sinkName].prototype instanceof RemObjects.SDK.ROComplexType) {
  1189. var sink = new RemObjects.SDK.RTTI[sinkName]();
  1190. sink.readEvent(events, eventName);
  1191. if (that.fHandlers[eventName]) {
  1192. that.fHandlers[eventName](RemObjects.SDK.ROStructType.prototype.toObject.call(sink[eventName]));
  1193. };
  1194. } else {
  1195. throw new Error("EventReceiver.intPollServer: unknown event sink");
  1196. };
  1197. };
  1198. }, RemObjects.UTIL.showError);
  1199. } catch (e) {
  1200. RemObjects.UTIL.showError(msg, e);
  1201. };
  1202. };
  1203. function TitaniumAjaxWrapper(url) {
  1204. this.updating = false;
  1205. this.urlCall = url;
  1206. };
  1207. TitaniumAjaxWrapper.prototype.post = function post(passData, isBinary, onSuccessFunction, onErrorFunction) {
  1208. if (this.updating) {
  1209. return false;
  1210. };
  1211. this.AJAX = null;
  1212. this.AJAX = Ti.Network.createHTTPClient({
  1213. onload: function(e) {
  1214. Ti.API.info("onload");
  1215. if (isBinary) {
  1216. onSuccessFunction(this.responseData, 200);
  1217. } else {
  1218. onSuccessFunction(this.responseText, 200);
  1219. };
  1220. },
  1221. onerror: function(e) {
  1222. Ti.API.info('XHR Error ' + e.error);
  1223. },
  1224. timeout:5000
  1225. });
  1226. this.updating = new Date();
  1227. var uri = this.urlCall + '?' + this.updating.getTime();
  1228. Ti.API.info("TitaniumAjaxWrapper " + uri);
  1229. this.AJAX.open("POST", uri);
  1230. // if (isBinary) {
  1231. // this.AJAX.setRequestHeader('Content-Type','multipart/form-data');
  1232. // }
  1233. this.AJAX.send(passData);
  1234. };
  1235. function AjaxWrapper(url) {
  1236. this.updating = false;
  1237. this.urlCall = url;
  1238. };
  1239. AjaxWrapper.prototype.abort = function abort() {
  1240. if (this.updating) {
  1241. this.updating = false;
  1242. this.AJAX.abort();
  1243. this.AJAX = null;
  1244. };
  1245. };
  1246. AjaxWrapper.prototype.post = function post(passData, isBinary, onSuccessFunction, onErrorFunction) {
  1247. function isIE10Up() {
  1248. if (!navigator)
  1249. return false;
  1250. // Project Spartan is not yet supported
  1251. // This code detects only IE 10 and IE 11
  1252. return (navigator.userAgent.indexOf("MSIE 10") != -1)
  1253. || (!!navigator.userAgent.match(/Trident\/7\./));
  1254. };
  1255. if (this.updating) {
  1256. return false;
  1257. };
  1258. this.AJAX = null;
  1259. try {
  1260. this.AJAX = new XMLHttpRequest();
  1261. } catch (e) {
  1262. // Internet Explorer Browsers
  1263. try {
  1264. this.AJAX = new ActiveXObject("Msxml2.XMLHTTP");
  1265. } catch (e) {
  1266. try {
  1267. this.AJAX = new ActiveXObject("Microsoft.XMLHTTP");
  1268. } catch (e) {
  1269. throw new Error("Your browser doesn't support XMLHttpRequest object");
  1270. };
  1271. };
  1272. };
  1273. if (this.AJAX == null) {
  1274. return false;
  1275. } else {
  1276. this.onSuccess = onSuccessFunction || function () {
  1277. };
  1278. this.onError = onErrorFunction || function () {
  1279. };
  1280. var that = this;
  1281. this.AJAX.onreadystatechange = function onreadystatechange() {
  1282. if (that.AJAX.readyState == 4) {
  1283. that.updating = false;
  1284. if (that.AJAX.status == 200) {
  1285. if (isIE10Up() && typeof(that.AJAX.response) != "string") {
  1286. var response = "";
  1287. var arr = new Uint8Array(that.AJAX.response);
  1288. for (var i = 0; i < arr.length; i++) response += String.fromCharCode(arr[i]);
  1289. that.onSuccess(response, that.AJAX.status/*, that.AJAX.responseXML*/);
  1290. } else {
  1291. that.onSuccess(that.AJAX.responseText, that.AJAX.status, that.AJAX.responseXML);
  1292. };
  1293. } else {
  1294. that.onError(that.AJAX.responseText, that.AJAX.status, that.AJAX.responseXML);
  1295. };
  1296. that.AJAX = null;
  1297. };
  1298. };
  1299. this.updating = new Date();
  1300. var uri = this.urlCall + '?' + this.updating.getTime();
  1301. this.AJAX.open("POST", uri, true);
  1302. //this.AJAX.setRequestHeader("Content-Length", passData.length);
  1303. if (isBinary == true) {
  1304. if (this.AJAX.overrideMimeType)
  1305. this.AJAX.overrideMimeType('text/plain; charset=x-user-defined');
  1306. this.AJAX.setRequestHeader("Content-type", "application/octet-stream");
  1307. if (this.AJAX.sendAsBinary) {
  1308. this.AJAX.sendAsBinary(passData);
  1309. } else {
  1310. var len = passData.length;
  1311. var data = new Uint8Array(len);
  1312. for (var i=0; i<len; i++) {
  1313. data[i] = passData.charCodeAt(i);
  1314. };
  1315. if (isIE10Up()) {
  1316. this.AJAX.responseType = "arraybuffer";
  1317. };
  1318. this.AJAX.send(data.buffer);
  1319. };
  1320. } else {
  1321. this.AJAX.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  1322. this.AJAX.send(passData);
  1323. };
  1324. return true;
  1325. };
  1326. };
  1327. // binary parser by Jonas Raoni Soares Silva
  1328. function BinaryParser() {
  1329. this.BigEndian = true;
  1330. };
  1331. BinaryParser.prototype.warn = function warn(msg) {throw new Error(msg)};
  1332. BinaryParser.prototype.decodeFloat = function decodeFloat( data, precisionBits, exponentBits ){
  1333. var b = new this.Buffer( this.bigEndian, data );
  1334. b.checkBuffer( precisionBits + exponentBits + 1 );
  1335. var bias = Math.pow( 2, exponentBits - 1 ) - 1, signal = b.readBits( precisionBits + exponentBits, 1 ), exponent = b.readBits( precisionBits, exponentBits ), significand = 0,
  1336. divisor = 2, curByte = b.buffer.length + ( -precisionBits >> 3 ) - 1;
  1337. do
  1338. for( var byteValue = b.buffer[ ++curByte ], startBit = precisionBits % 8 || 8, mask = 1 << startBit; mask >>= 1; ( byteValue & mask ) && ( significand += 1 / divisor ), divisor *= 2 );
  1339. while( precisionBits -= startBit );
  1340. return exponent == ( bias << 1 ) + 1 ? significand ? NaN : signal ? -Infinity : +Infinity : ( 1 + signal * -2 ) * ( exponent || significand ? !exponent ? Math.pow( 2, -bias + 1 ) * significand : Math.pow( 2, exponent - bias ) * ( 1 + significand ) : 0 );
  1341. };
  1342. BinaryParser.prototype.encodeFloat = function encodeFloat( data, precisionBits, exponentBits ){
  1343. var bias = Math.pow( 2, exponentBits - 1 ) - 1, minExp = -bias + 1, maxExp = bias, minUnnormExp = minExp - precisionBits,
  1344. status = isNaN( n = parseFloat( data ) ) || n == -Infinity || n == +Infinity ? n : 0,
  1345. exp = 0, len = 2 * bias + 1 + precisionBits + 3, bin = new Array( len ),
  1346. signal = ( n = status !== 0 ? 0 : n ) < 0, n = Math.abs( n ), intPart = Math.floor( n ), floatPart = n - intPart,
  1347. i, lastBit, rounded, j, result;
  1348. for( i = len; i; bin[--i] = 0 );
  1349. for( i = bias + 2; intPart && i; bin[--i] = intPart % 2, intPart = Math.floor( intPart / 2 ) );
  1350. for( i = bias + 1; floatPart > 0 && i; ( bin[++i] = ( ( floatPart *= 2 ) >= 1 ) - 0 ) && --floatPart );
  1351. for( i = -1; ++i < len && !bin[i]; );
  1352. if( bin[( lastBit = precisionBits - 1 + ( i = ( exp = bias + 1 - i ) >= minExp && exp <= maxExp ? i + 1 : bias + 1 - ( exp = minExp - 1 ) ) ) + 1] ){
  1353. if( !( rounded = bin[lastBit] ) ) {
  1354. for( j = lastBit + 2; !rounded && j < len; rounded = bin[j++] ) {};
  1355. };
  1356. for( j = lastBit + 1; rounded && --j >= 0; ( bin[j] = !bin[j] - 0 ) && ( rounded = 0 ) ){};
  1357. };
  1358. for( i = i - 2 < 0 ? -1 : i - 3; ++i < len && !bin[i]; ){};
  1359. if( ( exp = bias + 1 - i ) >= minExp && exp <= maxExp ) {
  1360. ++i;
  1361. } else if( exp < minExp ){
  1362. exp != bias + 1 - len && exp < minUnnormExp && this.warn( "encodeFloat::float underflow" );
  1363. i = bias + 1 - ( exp = minExp - 1 );
  1364. };
  1365. if( intPart || status !== 0 ){
  1366. this.warn( intPart ? "encodeFloat::float overflow" : "encodeFloat::" + status );
  1367. exp = maxExp + 1;
  1368. i = bias + 2;
  1369. if( status == -Infinity ) {
  1370. signal = 1;
  1371. } else if( isNaN( status ) )
  1372. bin[i] = 1;
  1373. };
  1374. for( n = Math.abs( exp + bias ), j = exponentBits + 1, result = ""; --j; result = ( n % 2 ) + result, n = n >>= 1 );
  1375. for( n = 0, j = 0, i = ( result = ( signal ? "1" : "0" ) + result + bin.slice( i, i + precisionBits ).join( "" ) ).length, r = []; i; j = ( j + 1 ) % 8 ){
  1376. n += ( 1 << j ) * result.charAt( --i );
  1377. if( j == 7 ){
  1378. r[r.length] = String.fromCharCode( n );
  1379. n = 0;
  1380. };
  1381. };
  1382. r[r.length] = n ? String.fromCharCode( n ) : "";
  1383. return ( this.bigEndian ? r.reverse() : r ).join( "" );
  1384. };
  1385. BinaryParser.prototype.encodeInt = function encodeInt(number, bits, signed){
  1386. var max = Math.pow(2, bits), r = [];
  1387. (number >= max || number < -Math.pow(2, bits-1)) && this.warn("encodeInt::overflow") && (number = 0);
  1388. number < 0 && (number += max);
  1389. for(; number; r[r.length] = String.fromCharCode(number % 256), number = Math.floor(number / 256));
  1390. for(bits = -(-bits >> 3) - r.length; bits--; r[r.length] = "\0");
  1391. return (this.bigEndian ? r.reverse() : r).join("");
  1392. };
  1393. BinaryParser.prototype.decodeInt = function decodeInt(data, bits, signed){
  1394. var b = new this.Buffer(this.bigEndian, data), x = b.readBits(0, bits), max = Math.pow(2, bits);
  1395. return signed && x >= max / 2 ? x - max : x;
  1396. };
  1397. with({p: (BinaryParser.prototype.Buffer = function Buffer(bigEndian, buffer){
  1398. this.bigEndian = bigEndian || 0, this.buffer = [], this.setBuffer(buffer);
  1399. }).prototype}){
  1400. p.readBits = function(start, length){
  1401. //shl fix: Henri Torgemane ~1996 (compressed by Jonas Raoni)
  1402. function shl(a, b){
  1403. // for(++b; --b; a = ((a %= 0x7fffffff + 1) & 0x40000000) == 0x40000000 ? a * 2 : (a - 0x40000000) * 2 + 0x7fffffff + 1);
  1404. for(++b; --b; a = ((a %= 0x7fffffffffff + 1) & 0x400000000000) == 0x400000000000 ? a * 2 : (a - 0x400000000000) * 2 + 0x7fffffffffff + 1);
  1405. return a;
  1406. };
  1407. if(start < 0 || length <= 0)
  1408. return 0;
  1409. this.checkBuffer(start + length);
  1410. for(var offsetLeft, offsetRight = start % 8, curByte = this.buffer.length - (start >> 3) - 1,
  1411. lastByte = this.buffer.length + (-(start + length) >> 3), diff = curByte - lastByte,
  1412. sum = ((this.buffer[ curByte ] >> offsetRight) & ((1 << (diff ? 8 - offsetRight : length)) - 1))
  1413. + (diff && (offsetLeft = (start + length) % 8) ? (this.buffer[ lastByte++ ] & ((1 << offsetLeft) - 1))
  1414. << (diff-- << 3) - offsetRight : 0); diff; sum += shl(this.buffer[ lastByte++ ], (diff-- << 3) - offsetRight)
  1415. );
  1416. return sum;
  1417. };
  1418. p.setBuffer = function setBuffer(data){
  1419. if(data){
  1420. for(var l, i = l = data.length, b = this.buffer = new Array(l); i; b[l - i] = data.charCodeAt(--i) & 0xFF);
  1421. // for(var l, i = l = data.length, b = this.buffer = new Array(l); i; b[l - i] = data.charCodeAt(--i));
  1422. this.bigEndian && b.reverse();
  1423. };
  1424. };
  1425. p.hasNeededBits = function hasNeededBits(neededBits){
  1426. return this.buffer.length >= -(-neededBits >> 3);
  1427. };
  1428. p.checkBuffer = function checkBuffer(neededBits){
  1429. if(!this.hasNeededBits(neededBits)) {
  1430. throw new Error("checkBuffer::missing bytes");};
  1431. };
  1432. };
  1433. /*
  1434. DEFLATE implementation based on http://www.codeproject.com/Articles/26980/Binary-Formats-in-JavaScript-Base64-Deflate-and-UT
  1435. Copyright (c) 2008 notmasteryet
  1436. Permission is hereby granted, free of charge, to any person
  1437. obtaining a copy of this software and associated documentation
  1438. files (the "Software"), to deal in the Software without
  1439. restriction, including without limitation the rights to use,
  1440. copy, modify, merge, publish, distribute, sublicense, and/or sell
  1441. copies of the Software, and to permit persons to whom the
  1442. Software is furnished to do so, subject to the following
  1443. conditions:
  1444. The above copyright notice and this permission notice shall be
  1445. included in all copies or substantial portions of the Software.
  1446. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  1447. EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  1448. OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  1449. NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  1450. HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  1451. WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  1452. FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  1453. OTHER DEALINGS IN THE SOFTWARE.
  1454. */
  1455. RemObjects.ZLIB = {
  1456. staticCodes:null,
  1457. staticDistances:null,
  1458. encodedLengthStart:new Array(3, 4, 5, 6, 7, 8, 9, 10,
  1459. 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99,
  1460. 115, 131, 163, 195, 227, 258),
  1461. encodedLengthAdditionalBits:new Array(0, 0, 0, 0, 0, 0, 0, 0,
  1462. 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0),
  1463. encodedDistanceStart:new Array(1, 2, 3, 4, 5, 7, 9,
  1464. 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049,
  1465. 3073, 4097, 6145, 8193, 12289, 16385, 24577),
  1466. encodedDistanceAdditionalBits:new Array(0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,
  1467. 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13),
  1468. clenMap:new Array(16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15),
  1469. buildCodes:function buildCodes(lengths) {
  1470. var codes = new Array(lengths.length);
  1471. var maxBits = lengths[0];
  1472. for (var i = 1; i < lengths.length; i++) {
  1473. if (maxBits < lengths[i]) maxBits = lengths[i];
  1474. };
  1475. var bitLengthsCount = new Array(maxBits + 1);
  1476. for (var i = 0; i <= maxBits; i++) bitLengthsCount[i] = 0;
  1477. for (var i = 0; i < lengths.length; i++) {
  1478. ++bitLengthsCount[lengths[i]];
  1479. };
  1480. var nextCode = new Array(maxBits + 1);
  1481. var code = 0;
  1482. bitLengthsCount[0] = 0;
  1483. for (var bits = 1; bits <= maxBits; bits++) {
  1484. code = (code + bitLengthsCount[bits - 1]) << 1;
  1485. nextCode[bits] = code;
  1486. };
  1487. for (var n = 0; n < codes.length; n++) {
  1488. var len = lengths[n];
  1489. if (len != 0) {
  1490. codes[n] = nextCode[len];
  1491. nextCode[len]++;
  1492. };
  1493. };
  1494. return codes;
  1495. },
  1496. initializeStaticTrees:function initializeStaticTrees() {
  1497. var codes = new Array(288);
  1498. var codesLengths = new Array(288);
  1499. for (var i = 0; i <= 143; i++) {
  1500. codes[i] = 0x0030 + i;
  1501. codesLengths[i] = 8;
  1502. };
  1503. for (var i = 144; i <= 255; i++) {
  1504. codes[i] = 0x0190 + i - 144;
  1505. codesLengths[i] = 9;
  1506. };
  1507. for (var i = 256; i <= 279; i++) {
  1508. codes[i] = 0x0000 + i - 256;
  1509. codesLengths[i] = 7;
  1510. };
  1511. for (var i = 280; i <= 287; i++) {
  1512. codes[i] = 0x00C0 + i - 280;
  1513. codesLengths[i] = 8;
  1514. };
  1515. RemObjects.ZLIB.staticCodes = RemObjects.ZLIB.buildTree(codes, codesLengths);
  1516. var distances = new Array(32);
  1517. var distancesLengths = new Array(32);
  1518. for (var i = 0; i <= 31; i++) {
  1519. distances[i] = i;
  1520. distancesLengths[i] = 5;
  1521. };
  1522. RemObjects.ZLIB.staticDistances = RemObjects.ZLIB.buildTree(distances, distancesLengths);
  1523. },
  1524. buildTree:function buildTree(codes, lengths) {
  1525. var nonEmptyCodes = new Array(0);
  1526. for (var i = 0; i < codes.length; ++i) {
  1527. if (lengths[i] > 0) {
  1528. var code = new Object();
  1529. code.bits = codes[i];
  1530. code.length = lengths[i];
  1531. code.index = i;
  1532. nonEmptyCodes.push(code);
  1533. };
  1534. };
  1535. return RemObjects.ZLIB.buildTreeBranch(nonEmptyCodes, 0, 0);
  1536. },
  1537. buildTreeBranch: function buildTreeBranch(codes, prefix, prefixLength) {
  1538. if (codes.length == 0) return null;
  1539. var zeros = new Array(0);
  1540. var ones = new Array(0);
  1541. var branch = new Object();
  1542. branch.isLeaf = false;
  1543. for (var i = 0; i < codes.length; ++i) {
  1544. if (codes[i].length == prefixLength && codes[i].bits == prefix) {
  1545. branch.isLeaf = true;
  1546. branch.index = codes[i].index;
  1547. break;
  1548. } else {
  1549. var nextBit = ((codes[i].bits >> (codes[i].length - prefixLength - 1)) & 1) > 0;
  1550. if (nextBit) {
  1551. ones.push(codes[i]);
  1552. } else {
  1553. zeros.push(codes[i]);
  1554. };
  1555. };
  1556. };
  1557. if (!branch.isLeaf) {
  1558. branch.zero = RemObjects.ZLIB.buildTreeBranch(zeros, (prefix << 1), prefixLength + 1);
  1559. branch.one = RemObjects.ZLIB.buildTreeBranch(ones, (prefix << 1) | 1, prefixLength + 1);
  1560. };
  1561. return branch;
  1562. },
  1563. readDynamicTrees:function readDynamicTrees(bitReader) {
  1564. var hlit = bitReader.readLSB(5) + 257;
  1565. var hdist = bitReader.readLSB(5) + 1;
  1566. var hclen = bitReader.readLSB(4) + 4;
  1567. var clen = new Array(19);
  1568. for (var i = 0; i < clen.length; ++i) clen[i] = 0;
  1569. for (var i = 0; i < hclen; ++i) clen[RemObjects.ZLIB.clenMap[i]] = bitReader.readLSB(3);
  1570. var clenCodes = RemObjects.ZLIB.buildCodes(clen);
  1571. var clenTree = RemObjects.ZLIB.buildTree(clenCodes, clen);
  1572. var lengthsSequence = new Array(0);
  1573. while (lengthsSequence.length < hlit + hdist) {
  1574. var p = clenTree;
  1575. while (!p.isLeaf) {
  1576. p = bitReader.readBit() ? p.one : p.zero;
  1577. };
  1578. var code = p.index;
  1579. if (code <= 15) {
  1580. lengthsSequence.push(code);
  1581. } else if (code == 16) {
  1582. var repeat = bitReader.readLSB(2) + 3;
  1583. for (var q = 0; q < repeat; ++q)
  1584. lengthsSequence.push(lengthsSequence[lengthsSequence.length - 1]);
  1585. } else if (code == 17) {
  1586. var repeat = bitReader.readLSB(3) + 3;
  1587. for (var q = 0; q < repeat; ++q)
  1588. lengthsSequence.push(0);
  1589. } else if (code == 18) {
  1590. var repeat = bitReader.readLSB(7) + 11;
  1591. for (var q = 0; q < repeat; ++q)
  1592. lengthsSequence.push(0);
  1593. };
  1594. };
  1595. var codesLengths = lengthsSequence.slice(0, hlit);
  1596. var codes = RemObjects.ZLIB.buildCodes(codesLengths);
  1597. var distancesLengths = lengthsSequence.slice(hlit, hlit + hdist);
  1598. var distances = RemObjects.ZLIB.buildCodes(distancesLengths);
  1599. var result = new Object();
  1600. result.codesTree = RemObjects.ZLIB.buildTree(codes, codesLengths);
  1601. result.distancesTree = RemObjects.ZLIB.buildTree(distances, distancesLengths);
  1602. return result;
  1603. },
  1604. BitReader:function BitReader(reader) {
  1605. this.bitsLength = 0;
  1606. this.bits = 0;
  1607. this.reader = reader;
  1608. this.readBit = function () {
  1609. if (this.bitsLength == 0) {
  1610. var nextByte = this.reader.readByte();
  1611. if (nextByte < 0) throw new "Unexpected end of stream";
  1612. this.bits = nextByte;
  1613. this.bitsLength = 8;
  1614. };
  1615. var bit = (this.bits & 1) != 0;
  1616. this.bits >>= 1;
  1617. --this.bitsLength;
  1618. return bit;
  1619. };
  1620. this.align = function () {
  1621. this.bitsLength = 0;
  1622. };
  1623. this.readLSB = function (length) {
  1624. var data = 0;
  1625. for (var i = 0; i < length; ++i) {
  1626. if (this.readBit()) data |= 1 << i;
  1627. };
  1628. return data;
  1629. };
  1630. this.readMSB = function (length) {
  1631. var data = 0;
  1632. for (var i = 0; i < length; ++i) {
  1633. if (this.readBit()) data = (data << 1) | 1; else data <<= 1;
  1634. };
  1635. return data;
  1636. };
  1637. },
  1638. Inflator:function Inflator(reader) {
  1639. this.reader = reader;
  1640. this.bitReader = new RemObjects.ZLIB.BitReader(reader);
  1641. this.buffer = new Array(0);
  1642. this.bufferPosition = 0;
  1643. this.state = 0;
  1644. this.blockFinal = false;
  1645. this.readByte = function () {
  1646. while (this.bufferPosition >= this.buffer.length) {
  1647. var item = this.decodeItem();
  1648. if (item == null) return -1;
  1649. switch (item.itemType) {
  1650. case 0:
  1651. this.buffer = this.buffer.concat(item.array);
  1652. break;
  1653. case 2:
  1654. this.buffer.push(item.symbol);
  1655. break;
  1656. case 3:
  1657. var j = this.buffer.length - item.distance;
  1658. for (var i = 0; i < item.length; i++) {
  1659. this.buffer.push(this.buffer[j++]);
  1660. };
  1661. break;
  1662. };
  1663. };
  1664. var symbol = this.buffer[this.bufferPosition++];
  1665. if (this.bufferPosition > 0xC000) {
  1666. var shift = this.buffer.length - 0x8000;
  1667. if (shift > this.bufferPosition) shift = this.bufferPosition;
  1668. this.buffer.splice(0, shift);
  1669. this.bufferPosition -= shift;
  1670. };
  1671. return symbol;
  1672. };
  1673. this.decodeItem = function () {
  1674. if (this.state == 2) return null;
  1675. var item;
  1676. if (this.state == 0) {
  1677. this.blockFinal = this.bitReader.readBit();
  1678. var blockType = this.bitReader.readLSB(2);
  1679. switch (blockType) {
  1680. case 0:
  1681. this.bitReader.align();
  1682. var len = this.bitReader.readLSB(16);
  1683. var nlen = this.bitReader.readLSB(16);
  1684. if ((len & ~nlen) != len) throw "Invalid block type 0 length";
  1685. item = new Object();
  1686. item.itemType = 0;
  1687. item.array = new Array(len);
  1688. for (var i = 0; i < len; ++i) {
  1689. var nextByte = this.reader.readByte();
  1690. if (nextByte < 0) throw "Uncomplete block";
  1691. item.array[i] = nextByte;
  1692. }
  1693. if (this.blockFinal) this.state = 2;
  1694. return item;
  1695. case 1:
  1696. this.codesTree = RemObjects.ZLIB.staticCodes;
  1697. this.distancesTree = RemObjects.ZLIB.staticDistances;
  1698. this.state = 1;
  1699. break;
  1700. case 2:
  1701. var dynamicTrees = RemObjects.ZLIB.readDynamicTrees(this.bitReader);
  1702. this.codesTree = dynamicTrees.codesTree;
  1703. this.distancesTree = dynamicTrees.distancesTree;
  1704. this.state = 1;
  1705. break;
  1706. default:
  1707. throw new "Invalid block type (3)";
  1708. };
  1709. };
  1710. item = new Object();
  1711. var p = this.codesTree;
  1712. while (!p.isLeaf) {
  1713. p = this.bitReader.readBit() ? p.one : p.zero;
  1714. };
  1715. if (p.index < 256) {
  1716. item.itemType = 2;
  1717. item.symbol = p.index;
  1718. } else if (p.index > 256) {
  1719. var lengthCode = p.index;
  1720. if (lengthCode > 285) throw new "Invalid length code";
  1721. var length = RemObjects.ZLIB.encodedLengthStart[lengthCode - 257];
  1722. if (RemObjects.ZLIB.encodedLengthAdditionalBits[lengthCode - 257] > 0) {
  1723. length += this.bitReader.readLSB(RemObjects.ZLIB.encodedLengthAdditionalBits[lengthCode - 257]);
  1724. };
  1725. p = this.distancesTree;
  1726. while (!p.isLeaf) {
  1727. p = this.bitReader.readBit() ? p.one : p.zero;
  1728. };
  1729. var distanceCode = p.index;
  1730. var distance = RemObjects.ZLIB.encodedDistanceStart[distanceCode];
  1731. if (RemObjects.ZLIB.encodedDistanceAdditionalBits[distanceCode] > 0) {
  1732. distance += this.bitReader.readLSB(RemObjects.ZLIB.encodedDistanceAdditionalBits[distanceCode]);
  1733. };
  1734. item.itemType = 3;
  1735. item.distance = distance;
  1736. item.length = length;
  1737. } else {
  1738. item.itemType = 1;
  1739. this.state = this.blockFinal ? 2 : 0;
  1740. };
  1741. return item;
  1742. };
  1743. }
  1744. };
  1745. RemObjects.ZLIB.initializeStaticTrees();