0% found this document useful (0 votes)
13K views33 pages

Printer Bidi Schema Request Handling

This document contains JavaScript code for processing requests and retrieving status information from a printer. It defines functions for getting schemas, setting schemas, getting status, and requesting status. It includes a RequestProcessor class for handling requests and responses. The code retrieves status details like the state reason from an XML response and adds it to the response object.

Uploaded by

AmorVander
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
13K views33 pages

Printer Bidi Schema Request Handling

This document contains JavaScript code for processing requests and retrieving status information from a printer. It defines functions for getting schemas, setting schemas, getting status, and requesting status. It includes a RequestProcessor class for handling requests and responses. The code retrieves status details like the state reason from an XML response and adds it to the response object.

Uploaded by

AmorVander
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 33

/// <reference path="v4PrintDriver-Intellisense.

js" />

// Version 3.5.2

//

// Note: See http://san-xwiki-1.cscr.hp.com:8080/xwiki/bin/view/CSL_Components/v4BiDiUSBExtension

// for documentation on the query strings and functions used to build queries.

getSchemas = function(scriptContext, printerStream, schemaRequests, printerBidiSchemaResponses) {

//debugger;

var pageCache = new PageCache(scriptContext, printerStream);

var requestProcessor = new RequestProcessor(printerBidiSchemaResponses, pageCache,


scriptContext);

var i = 0;

for (i = 0; i < schemaRequests.length; i++) {

var args = schemaRequests[i].split(';');

if (args.length >=3) {

var queryStr = args[0];

var procFunc = args[1];

var ledmResource = args[2];

var params = [];

if (args.length >= 4) {

params = args.slice(3);

if (requestProcessor.ValidGetFunctions.indexOf(procFunc) != -1) {

requestProcessor[procFunc](queryStr, ledmResource, params);

}
return 0;

};

setSchema = function(scriptContext, printerStream, printerBidiSchemaElement) {

//debugger;

var pageCache = new PageCache(scriptContext, printerStream);

var value = printerBidiSchemaElement.value;

try {

if (printerBidiSchemaElement.type === "BIDI_STRING") {

value = value.replace(/&lt;/g,"<").replace(/&gt;/g,">");

var response = pageCache.RawRequest(value);

printerBidiSchemaElement.value = response;

} catch (err) {

pageCache.log = "setSchema exception caught: " + err;

return 0;

};

getStatus = function(scriptContext, printerStream, printerBidiSchemaResponses) {

return 2;

};

requestStatus = function (scriptContext, printerStream, printerBidiSchemaResponses) {

var retVal = 2;

var pageCache = new PageCache(scriptContext, printerStream);

var requestProcessor = new RequestProcessor(printerBidiSchemaResponses, pageCache,


scriptContext);

pageCache.statusRead = true;
var statusContent = pageCache.GetContent("/DevMgmt/ProductStatusDyn.xml", false);

if ((null != statusContent) && (statusContent !="" )) {

var statusValue = requestProcessor.InnerXml("psdyn:Status", statusContent);

var statusMsg = requestProcessor.InnerXml("pscat:StatusCategory", statusValue);

if (statusMsg.toUpperCase() == "DoorOpen".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason', 'DoorOpen');

else if (statusMsg.toUpperCase() == "closeDoorOrCover".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'closeDoorOrCover');

else if (statusMsg.toUpperCase() == "MediaEmpty".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason', 'MediaEmpty');

else if ((statusMsg.toUpperCase() == "toner-empty-error".toUpperCase()))

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason', 'toner-empty-
error');

else if (statusMsg.toUpperCase() == "MediaJam".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason', 'MediaJam');

else if (statusMsg.toUpperCase() == "jamInPrinter".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason', 'jamInPrinter');

else if (statusMsg.toUpperCase() == "output-area-full".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason', 'output-area-
full');

else if (statusMsg.toUpperCase() == "toner-empty-warning".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason', 'toner-empty-
warning');

else if (statusMsg.toUpperCase() == "toner-low-report".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason', 'toner-low-
report');

else if (statusMsg.toUpperCase() == "trayEmptyOrOpen".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'trayEmptyOrOpen');

else if (statusMsg.toUpperCase() == "cartridgeMissing".toUpperCase())


printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'cartridgeMissing');

else if (statusMsg.toUpperCase() == "paused".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason', 'paused');

else if (statusMsg.toUpperCase() == "cartridgeLow".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason', 'cartridgeLow');

else if (statusMsg.toUpperCase() == "replaceCartridgeOut".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'replaceCartridgeOut');

else if (statusMsg.toUpperCase() == "cartridgeVeryLow".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'cartridgeVeryLow');

else if (statusMsg.toUpperCase() == "cartridgeCounterfeitQuestion".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'cartridgeCounterfeitQuestion');

else if (statusMsg.toUpperCase() == "cartridgeFailure".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'cartridgeFailure');

else if (statusMsg.toUpperCase() == "incompatibleConsumable".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'incompatibleConsumable');

else if (statusMsg.toUpperCase() == "insertSETUPCartridge".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'insertSETUPCartridge');

else if (statusMsg.toUpperCase() == "upgradableSupply".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'upgradableSupply');

else if (statusMsg.toUpperCase() == "nonHPSupplyDetected".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'nonHPSupplyDetected');

else if (statusMsg.toUpperCase() == "genuineHP".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason', 'genuineHP');
else if (statusMsg.toUpperCase() == "startupRoutineFailed".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'startupRoutineFailed');

else if (statusMsg.toUpperCase() == "inReserveMode".toUpperCase())

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason',
'inReserveMode');

else

printerBidiSchemaResponses.AddString('\\Printer.Status.Summary:StateReason', 'None');

retVal = 0;

return retVal;

};

RequestProcessor = function(printerBidiSchemaResponses, pageCache, scriptContext) {

this.responses = printerBidiSchemaResponses;

this.pageCache = pageCache;

this.Context = scriptContext;

this.content = "";

this.ValidGetFunctions =
"FindIndexXmlStr,TagContainsBool,TagAnyContainsBool,FindIndexXmlConvertStr,AllContentStr," +

"FindIndexXmlInt,
InnerXmlInt,InnerXmlStr,InnerXmlMapStr,GetQueuePropStr,QueueRequestStr,StrCmpBool,MultiTagCon
tainsBool";

// ,ElementListStr,NthElementStr

this.ValidSetFunctions = "SetRequest";

};

RequestProcessor.prototype.FindIndexXmlInt = function(bidiQueryStr, contentName, queryArray) {

var content = this.pageCache.GetContent(contentName, true);


this.content = "";

if (content)

var index = queryArray.pop();

var child = queryArray.pop();

if (queryArray.length > 0)

var result = this.FindIndexedXmlValue(content, queryArray, child, index);

if ((null != result) && (null != this.responses))

this.responses.AddInt32(bidiQueryStr,result);

return true;

return false;

};

RequestProcessor.prototype.FindIndexXmlStr = function(bidiQueryStr, contentName, queryArray) {

var content = this.pageCache.GetContent(contentName, true);

this.content = "";

if (content)

var index = queryArray.pop();

var child = queryArray.pop();

if (queryArray.length > 0)

var result = this.FindIndexedXmlValue(content, queryArray, child, index);


if ((null != result) && (null != this.responses))

this.responses.AddString(bidiQueryStr, result);

return true;

return false;

};

// FindIndexXmlConvertStr() and FindConversionValue() functions added by Albin for converting


between string data types

// For example converting Mediatype value from 'stationerylightweight'->'light'

RequestProcessor.prototype.FindIndexXmlConvertStr = function (bidiQueryStr, contentName,


queryArray) {

var content = this.pageCache.GetContent(contentName, true);

this.content = "";

if (content)

if (queryArray.length > 2)

var tempArray = queryArray.slice(0, 1);

var result = this.FindIndexedXmlValue(content, tempArray, queryArray[1], queryArray[2]);

if ((null != result) && (null != this.responses))

result = this.FindConversionValue(result, queryArray);

this.responses.AddString(bidiQueryStr, result);

}
}

return true;

return false;

};

RequestProcessor.prototype.FindConversionValue = function (result, queryArray, minSize) {

var MIN_SIZE=5;

if (null != result) {

if(typeof minSize=='undefined')

minSize=MIN_SIZE;

var i = minSize;

while (i <= queryArray.length)

if (result == queryArray[i - 2])

return queryArray[i - 1];

i = i + 2;

return result;

};

RequestProcessor.prototype.TagContainsBool = function(bidiQueryStr, contentName, queryArray) {

if ((null != queryArray) && (queryArray.length >= 2))

{
this.content = "";

var content = this.pageCache.GetContent(contentName, true);

if (content)

var result = false;

var queryPattern = new RegExp(queryArray.pop(), "gm");

var value = this.InnerXmlMultiple(queryArray, content);

if (null != value)

result = queryPattern.test(value);

if (null != this.responses)

this.responses.AddBool(bidiQueryStr, result);

return true;

return false;

return false;

};

// StrCmpBool() function added by Gurudatt for absolute string compare

RequestProcessor.prototype.StrCmpBool = function (bidiQueryStr, contentName, queryArray) {

if ((null != queryArray) && (queryArray.length >= 2))


{

this.content = "";

var content = this.pageCache.GetContent(contentName, true);

if (content)

var result = false;

var value = this.InnerXml(queryArray[0], content);

if (null != value)

if (value == queryArray[1])

result = true;

if (null != this.responses)

this.responses.AddBool(bidiQueryStr, result);

return true;

return false;

return false;

};

// MultiTagContainsBool() function added by Gurudatt for checking values of multiple nodes

//example usage:
//bidiQueryStr - \Printer.Configuration.DuplexUnit:Installed

//contentName - /DevMgmt/ProductConfigDyn.xml

//queryArray - dd:DuplexUnit,dd:DuplexBindingOption;Installed;longEdge;shortEdge

//dd: DuplexUnit nodevalue returned from device is checked for Installed||longEdge||shortEdge

//dd: DuplexBindingOption nodevalue returned from device is checked for


Installed||longEdge||shortEdge

RequestProcessor.prototype.MultiTagContainsBool = function (bidiQueryStr, contentName, queryArray)


{

var content = "";

var result = false;

content = this.pageCache.GetContent(contentName, true);

if (content)

var option = "";

var args = queryArray[0].split(',');

for (i = 0; i < args.length; i++)

if (-1 != content.indexOf(args[i]))

option = this.InnerXml(args[i], content);

if (option != null)

result = this.MultiStrCompBool(queryArray, option);

if (result == true)

break;

}
}

this.responses.AddBool(bidiQueryStr, result);

return true;

return false;

};

RequestProcessor.prototype.MultiStrCompBool = function (queryArray, option) {

for (j = queryArray.length; j > 1; j--)

if (option == queryArray.pop())

return true;

return false;

};

RequestProcessor.prototype.TagAnyContainsBool = function (bidiQueryStr, contentName, queryArray) {

if ((null != queryArray) && (queryArray.length >= 2))

var content = this.pageCache.GetContent(contentName, true);

this.content = "";
if (content)

var queryPattern = new RegExp(queryArray.pop(), "gm");

var result = false;

do

var value = this.InnerXmlMultiple(queryArray, content);

if ((null != value) && queryPattern.test(value))

result = true;

content = this.content;

} while (null != value);

if (null != this.responses)

this.responses.AddBool(bidiQueryStr, result);

return true;

return false;

return false;

};

RequestProcessor.prototype.InnerXmlInt = function (bidiQueryStr, contentName, queryArray) {


if (null != queryArray)

this.content = "";

var content = this.InnerXmlMultiple(queryArray, this.pageCache.GetContent(contentName, true));

if ((null != content) && (null != this.responses))

this.responses.AddInt32(bidiQueryStr, content);

if (content)

return true;

return false;

};

RequestProcessor.prototype.InnerXmlStr = function(bidiQueryStr,contentName, queryArray) {

if (null != queryArray)

this.content = "";

var content = this.InnerXmlMultiple(queryArray,this.pageCache.GetContent(contentName,true));

if ((null != content) && (null != this.responses))

this.responses.AddString(bidiQueryStr, content);

}
if (content)

return true;

return false;

};

RequestProcessor.prototype.AllContentStr = function(bidiQueryStr,contentName,queryArray) {

var cacheContent = false;

if (null != queryArray)

var truePattern = /true/;

cacheContent = truePattern.test(queryArray[0]);

var content = this.pageCache.GetContent(contentName, cacheContent);

if ((null != content) && (null != this.responses))

var xmlTagRe = /<\?.*\?>\r\n/gm;

if (xmlTagRe.test(content))

content = content.substring(xmlTagRe.lastIndex);

this.responses.AddString(bidiQueryStr, content);
return true;

return false;

};

RequestProcessor.prototype.InnerXmlMapStr = function(bidiQueryStr, contentName, queryArray) {

var mapIndex = 0;

var mapRe = /=/g;

for (mapIndex=0; mapIndex < queryArray.length; mapIndex++)

if (mapRe.test(queryArray[mapIndex]))

break;

var tagArray = queryArray.slice(0,mapIndex);

var mapArray = queryArray.slice(mapIndex);

var defaultValue = "Idle";

this.content = "";

var content = this.InnerXmlMultiple(tagArray,this.pageCache.GetContent(contentName,true));

if (null != content)

var re = new RegExp(content,"gm");

for (var i=0;i<mapArray.length;i++)

var idx = mapArray[i].indexOf("=");

var name = mapArray[i].substr(0,idx);


var value = mapArray[i].substring(idx+1);

if ((idx >= 0) && re.test(name))

this.responses.AddString(bidiQueryStr, value);

return;

if (name.indexOf("default") === 0)

defaultValue = value;

if (null != this.responses)

this.responses.AddString(bidiQueryStr,defaultValue);

return true;

return false;

};

RequestProcessor.prototype.FindIndexedXmlValue = function(xml, parent, child, index) {

if (null != xml) {

this.content = xml;

var indexRe = new RegExp(index, "gm");

do {
var innerXml = this.InnerXmlMultiple(parent, this.content);

if ((null != innerXml) && indexRe.test(innerXml)) {

innerXml = this.InnerXml(child, innerXml);

return innerXml;

} while (null != innerXml);

return null;

};

RequestProcessor.prototype.InnerXml = function(tag, xml) {

if ((null != xml) && (null != tag))

// If there is an attribute in the opening tag then we failed until I split the openRe in half and

// detected the close below (openIdx)

var openRe = new RegExp("<" + tag, "gm");

var closeRe = new RegExp("</" + tag + ">", "gm");

if (openRe.test(xml) && closeRe.test(xml))

var openIdx = xml.indexOf(">",openRe.lastIndex)+1;

var inner = xml.substring(openIdx, closeRe.lastIndex - tag.length - 3);

this.content = xml.substring(closeRe.lastIndex);

return inner;

return null;

};
RequestProcessor.prototype.InnerXmlMultiple = function(tagArray, xml) {

if ((null != xml) && (null != tagArray) && (tagArray.length > 0))

var index=0;

// Save the context for the parent so that this.content is correct when we leave

var parentContext = null;

var content = xml;

for (index=0;index<tagArray.length;index++)

if (null != content)

content = this.InnerXml(tagArray[index],content);

if ((null != content) && (null == parentContext))

parentContext = this.content;

else

break;

if (null != parentContext)

this.content = parentContext;

}
return content;

return null;

};

PageCache = function(scriptContext, printerStream) {

this.Context = scriptContext;

this.printerStream = printerStream;

this.ContentArray = [];

this.readContent = "";

this.ToMatch = "";

// lastHeader is used in error reporting when we fail a request.

this.lastHeader = null;

this.readAttempts = 0;

this.statusRead = false;

};

PageCache.prototype.GetContent = function(contentName, saveInCache) {

var content = null;

if (saveInCache)

content = this.ContentArray[contentName];

if ((content === undefined) || (content === null))

content = this.FetchLedmContent(contentName);

if ((content != undefined) && (content != null) && saveInCache)

this.SetContent(contentName, content);

}
}

return content;

};

PageCache.prototype.SetContent = function(contentName, content)

if (null != contentName)

this.ContentArray[contentName] = content;

};

// Break out RawRequest (it is common for all gets and sets) and simplify FetchLedmContent and
SetLedmContent

PageCache.prototype.FetchLedmContent = function(path) {

if (null != path)

if (this.VerifyChannel())

var requestStr = "GET ".concat(path, " HTTP/1.1\r\nHOST:\r\n\r\n");

return this.RawRequest(requestStr);

return null;

};

PageCache.prototype.VerifyChannel = function () {
if (this.ChannelVerified === undefined) {

//var pjlcommand = [0x40, 0x50, 0x4A, 0x4C, 0x20, 0x43, 0x4F, 0x4D, 0x4D, 0x45, 0x4E, 0x54, 0x20,
0x22, 0x22, 0x0D, 0x0A, 0x0D, 0x0A];

var pjlcommand = [0x1B, 0x25, 0x2D, 0x31, 0x32, 0x33, 0x34, 0x35, 0x58, 0x40, 0x50, 0x4A, 0x4C,
0x20, 0x43, 0x4F, 0x4D, 0x4D, 0x45, 0x4E, 0x54, 0x20, 0x22, 0x22, 0x0D, 0x0A, 0x1B, 0x25, 0x2D, 0x31,
0x32, 0x33, 0x34, 0x35, 0x58];

var writtenStrLen = this.printerStream.Write(pjlcommand);

if (this.IsWebServerConnected(500)) {

this.ChannelVerified = true;

} else {

this.ChannelVerified = false;

return this.ChannelVerified;

};

PageCache.prototype.SetLedmContent = function (method, path, content) {

if (null != path) {

if (null == method) method = "GET";

var requestStr = method.concat(" ", path, " HTTP/1.1\r\n");

if (null == content)

requestStr = requestStr.concat("\r\n");

} else

var contentLength = content.length;


requestStr = requestStr.concat("Content-Length: ", contentLength, "\r\n\r\n", content);

return this.RawRequest(requestStr);

return null;

};

PageCache.prototype.RawRequest = function (requestStr) {

var requestBytes = this.BytesFromString(requestStr);

var writtenStrLen = this.printerStream.Write(requestBytes);

if (writtenStrLen > 0)

var response = this.GetHttpResponse();

return response;

return null;

};

PageCache.prototype.GetHttpResponse = function () {

var httpHeader = new HttpHeader(this);

if (httpHeader.ReadHeaderNow()) {

var ledmResponse = "";

if (httpHeader.ContentLength > 0)

ledmResponse = this.ReadResponse(httpHeader.ContentLength);

else if (httpHeader.IsChunked)

{
ledmResponse = this.ReadChunkedResponse();

return ledmResponse;

return null;

};

PageCache.prototype.StringFromBytes = function (bytes) {

if ((bytes === undefined) || (bytes === null)) {

return null;

var length = bytes.length;

var result = "";

for (var i =0; i < length;i++)

if (bytes[i] != undefined)

result += String.fromCharCode(bytes[i]);

return result;

};

PageCache.prototype.BytesFromString = function(content) {

if (content === null)

return null;

}
var bytes = new Array(content.length);

for (var i=0; i<content.length; i++) {

bytes[i] = content.charCodeAt(i);

return bytes;

};

PageCache.prototype.ReadBlock = function (requestLength)

var totalLength = 0;

var zeroCount = 60;

var reqLen = 512;

do

try

// Delay the Read after handling huge data packets, this will make further responses from
the device better

// Try to avoid the Read crashes as much as possible

if(this.readAttempts > 50)

if(this.statusRead == false)

sleep(1000);

this.readAttempts = 0;

var tempBytes = this.printerStream.Read(reqLen);


}

catch (err)

return -1;

this.readAttempts++;

if (tempBytes.length > 0)

var actLen = tempBytes.length;

this.readContent = this.readContent += this.StringFromBytes(tempBytes);

totalLength += actLen;

requestLength -= actLen;

zeroCount = 60;

var StrContent = String(this.readContent);

if ((StrContent != "") && (StrContent.indexOf(this.ToMatch) >= 0))

this.ToMatch = "";

break;

else

sleep(3);

zeroCount--;

}while ((requestLength > 0) && (zeroCount > 0));

return totalLength;
};

PageCache.prototype.ReadResponse = function(len) {

var loopLimit = 100;

if (len != NaN)

do

var remLen = len - this.readContent.length;

var actLen = this.ReadBlock(remLen);

if ((actLen > 0) && (len == this.readContent.length))

var temp = this.readContent;

this.readContent = "";

return temp;

} while (loopLimit-- > 0);

return null;

};

PageCache.prototype.ReadChunkedResponse = function() {

var results = "";

var temp = "";

do {

temp = this.ReadChunk();

if (temp === "")

break;

if (null != temp) {

results = results.concat(temp);

}
else {

this.ReadBlock(2);

} while (temp != null);

return results;

};

PageCache.prototype.ReadChunkHeader = function() {

var i = this.readContent.indexOf("\r\n");

if (i > 0) {

var len = parseInt(this.readContent, 16);

this.readContent = this.readContent.substr(i+2);

return len;

return -1;

};

PageCache.prototype.ReadChunk = function() {

var chunkLength = this.ReadChunkHeader();

if (chunkLength < 0) {

this.ReadBlock(8);

chunkLength = this.ReadChunkHeader();

var chunkCountdown = 100;

if (chunkLength != 0)

do {

var remLen = chunkLength - this.readContent.length + 2;//The 2 bytes is for the


last \r\n to be read but not part of the chunk
if (remLen > 0)

i = this.ReadBlock(remLen);

if (chunkLength <= this.readContent.length)

var temp = this.readContent.substr(0,chunkLength);

this.readContent = this.readContent.substring(chunkLength+2);

return temp;

} while (chunkCountdown-- > 0);

else

return "";//this is done to handle 30 0D 0A 0D 0A

return null;

};

PageCache.prototype.IsWebServerConnected = function (timeout) {

var date = new Date();

var curDate = null;

var receivedData = false;

var badRequest = new RegExp("HTTP", "gmi");

do {

curDate = new Date();

var tempBytes = this.printerStream.Read(512);


if ((tempBytes != undefined) && (tempBytes.length > 0) &&
(badRequest.test(this.StringFromBytes(tempBytes))))

receivedData = true;

} while ((receivedData == false) && (curDate - date < timeout));

this.FlushChannel(100);

return receivedData;

};

PageCache.prototype.FlushChannel = function (timeout) {

var date = new Date();

var curDate = null;

do {

curDate = new Date();

var tempBytes = this.printerStream.Read(512);

} while (((tempBytes != null) && (tempBytes.length > 0)) && (curDate - date < timeout));

this.readContent = "";

};

HttpHeader = function(pageCache) {

this.StatusCode = 0;

this.IsChunked = false;

this.ContentLength = 0;

this.Content = "";

this.pageCache = pageCache;

};
HttpHeader.prototype.ReadHeaderNow = function () {

try {

if (this.ReadHeader() == true) {

this.pageCache.lastHeader = this;

} else {

return false;

} catch (err) {

return false;

return true;

};

HttpHeader.prototype.ReadHeader = function() {

var index = this.ReadUntil("HTTP/1.1");

if (index > 0) {

this.pageCache.readContent = this.pageCache.readContent.substring(index);

if (index >= 0) {

index = this.ReadUntil("\r\n\r\n");

if (index >= 0)

this.Content = this.pageCache.readContent.substring(0,index + 4);

this.pageCache.readContent = this.pageCache.readContent.substring(index+4);

this.StatusCode = parseInt(this.Content.substring(8));

if (this.StatusCode === 200)


{

var ContentLengthPattern = /^Content-Length:/gm;

var ChunkedPattern = /^Transfer-Encoding/gm;

if (ContentLengthPattern.test(this.Content))

this.ContentLength =
parseInt(this.Content.substring(ContentLengthPattern.lastIndex));

else if (ChunkedPattern.test(this.Content))

this.IsChunked = true;

else {

this.ContentLength = -1;

this.IsChunked = false;

else

return false;

return true;

};

HttpHeader.prototype.ReadUntil = function(match){

var index = this.pageCache.readContent.indexOf(match);


if (index >= 0) {

return index;

this.pageCache.ToMatch = match;

do {

if (this.pageCache.ReadBlock(512) <= 0) return -1;

index = this.pageCache.readContent.indexOf(match);

} while (index < 0);

return index;

};

function sleep(milliSeconds) {

var startTime = new Date().getTime();

while (new Date().getTime() < startTime + milliSeconds);

You might also like