<?xml version = "1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
<html xmlns = "http://www.w3.org/1999/xhtml">
<meta charset="UTF-8">


<head>
	<title>NDN Put via WebSocket</title>
	
	<script type="text/javascript" src="../Helper.js"></script>	
	
	<script type="text/javascript">
		var ndn = new NDN();
        ndn.transport.connectWebSocket(ndn);
        
        var AsyncPutClosure = function AsyncPutClosure() {
        	// Inherit from Closure.
			Closure.call(this);
		};
		
		AsyncPutClosure.prototype.upcall = function(kind, upcallInfo) {
			if (kind == Closure.UPCALL_FINAL) {
				// Do nothing.
			} else if (kind == Closure.UPCALL_INTEREST) {
				// Extract the Name from the Interest. var name = upcallInfo.Interest.name;;
				// Check that we want to respond to upcallInfo.interest. If yes, construct a ContentObject
				// response, put it to the NDN and return Closure.RESULT_INTEREST_CONSUMED. Else fall 
				// through to return Content.RESULT_OK.
				// See linemaker.py for more details.
				console.log('AsyncPutClosure.upcall() called.');
				var content = document.getElementById('content').value;
				var interest = upcallInfo.interest;
				var nameStr = escape(interest.name.getName());
				
				var si = new SignedInfo();
				si.setFields();
				
				var answer = DataUtils.stringToUtf8Array(content);
				
				var co = new ContentObject(new Name(nameStr), si, answer, new Signature()); 
				co.sign();
				var hex = encodeToHexContentObject(co);
				
				var bytearray = new Uint8Array(hex.length / 2);
	    		for (var i = 0; i < hex.length; i = i + 2) {
	        		bytearray[i / 2] = '0x' + hex.substr(i, 2);
	    		}
	    		
	    		upcallInfo.ndn.transport.ws.send(bytearray.buffer);
	    		console.log('ws.send() finised.');
	    		
	    		return Closure.RESULT_INTEREST_CONSUMED;
			}
			return Closure.RESULT_OK;
		};
        
		
		function run() {
			var contentName = document.getElementById('contentname').value;		
			
			var result = ndn.registerPrefix(new Name(contentName), new AsyncPutClosure());
			
			document.getElementById('result').innerHTML = 'Content name \'' + contentName 
					+'\' published. Result: ' + result;
		}
	
		</script>
	
</head>
<body >
	<form>
	<div>
		<p>Please Enter a Content Name:</p>
		
		<input id="contentname" type="text" name="CONTENTNAME" value="/wentao.shang/regtest001" /> 
		
                <p>Please Enter the Content:</p>
		
		<textarea id="content" cols="40" rows="5" name="CONTENT" >This works!</textarea> 
		
		<br />
		</div>
	</form>
	<div>
		<button onclick="run()">Publish Content</button>
	</div>
	
	<p id="result"></p>

</body>
</html>