199 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| var util = Require('util');
 | |
| var net = Require('net');
 | |
| var PackStream = Require('x11/core/unpackstream');
 | |
| var EventEmitter = Require('events').EventEmitter;
 | |
| 
 | |
| function XServer(servsock, params)
 | |
| {
 | |
|      var server = this;
 | |
|      EventEmitter.call(this);
 | |
|      servsock.on('connection', function(stream) {
 | |
|          var cli = new XServerClientConnection(stream, params);
 | |
|          server.emit('connection', cli);
 | |
|      });
 | |
| }
 | |
| util.inherits(XServer, EventEmitter);
 | |
| 
 | |
| function XServerClientConnection(stream, params)
 | |
| {
 | |
|      EventEmitter.call(this);
 | |
|      this.params = params;
 | |
|      var serv = this;
 | |
|      serv.stream = stream;
 | |
|      serv.pack_stream = new PackStream();
 | |
|      serv.pack_stream.on('data', function( data ) {
 | |
|          serv.stream.write(data);
 | |
|      });
 | |
|      stream.on('data', function( data ) {
 | |
|          serv.pack_stream.write(data);
 | |
|      });
 | |
|      serv.sequence = 0;
 | |
|      serv.readClientHandshake();
 | |
| }
 | |
| util.inherits(XServerClientConnection, EventEmitter);
 | |
| 
 | |
| XServerClientConnection.prototype.readClientHandshake = function()
 | |
| {
 | |
|     var serv = this;
 | |
|     var hello = {};
 | |
|     serv.pack_stream.unpackTo(hello,
 | |
|         [
 | |
|             'C byteOrder',
 | |
|             'x',
 | |
|             'S protocolMajor',
 | |
|             'S protocolMinor',
 | |
|             'S authTypeLength',
 | |
|             'S authDataLength',
 | |
|             'x',
 | |
|             'x'
 | |
|         ],
 | |
|         function() {
 | |
|             console.log(hello);
 | |
|             serv.pack_stream.get(hello.authTypeLength, function(authType) {
 | |
|                 serv.pack_stream.get(hello.authDataLength, function(authData) {
 | |
|                     serv.byteOrder = hello.byteOrder;
 | |
|                     serv.protocolMajor = hello.protocolMajor;
 | |
|                     serv.protocolMinor = hello.protocolMinor;
 | |
|                     serv.checkAuth(authType.toString('ascii'), authData);
 | |
|                 });
 | |
|             });
 | |
|         }
 | |
|     );
 | |
| }
 | |
| 
 | |
| XServerClientConnection.prototype.checkAuth = function(authType, authData)
 | |
| {
 | |
|     var serv = this;
 | |
|     // ignore check for now;
 | |
|     // protocol page 140: add code for reject & ask additional info
 | |
|     console.log('check auth');
 | |
|     console.log([authType, authData.toString()]);
 | |
| 
 | |
|     // auth ok: reply with list of screens, visuals, root window info etc
 | |
|     var stream = serv.pack_stream;
 | |
| 
 | |
| /*
 | |
|    xquartz exemple reply
 | |
| 
 | |
| { major: 11,
 | |
|   minor: 0,
 | |
|   xlen: 537, (bytes in whole header)
 | |
|   release: 11300000,
 | |
|   resource_base: 6291456,
 | |
|   resource_mask: 2097151,
 | |
|   motion_buffer_size: 256,
 | |
|   vlen: 20,
 | |
|   max_request_length: 65535,
 | |
|   screen_num: 1,
 | |
|   format_num: 7,
 | |
|   image_byte_order: 0,
 | |
|   bitmap_bit_order: 0,
 | |
|   bitmap_scanline_unit: 32,
 | |
|   bitmap_scanline_pad: 32,
 | |
|   min_keycode: 8,
 | |
|   max_keycode: 255 }
 | |
| 
 | |
| per screen:
 | |
| screen: { root: 226,
 | |
|   default_colormap: 33,
 | |
|   white_pixel: 16777215,
 | |
|   black_pixel: 0,
 | |
|   input_masks: 1703936,
 | |
|   pixel_width: 3286,
 | |
|   pixel_height: 1058,
 | |
|   mm_width: 866,
 | |
|   mm_height: 277,
 | |
|   min_installed_maps: 1,
 | |
|   max_installed_maps: 1,
 | |
|   root_visual: 34,
 | |
|   root_depth: 24,
 | |
|   backing_stores: 0,
 | |
|   num_depths: 7 }
 | |
| 17              'L root',¬
 | |
|  18              'L default_colormap',¬
 | |
|  19              'L white_pixel',¬
 | |
|  20              'L black_pixel',¬
 | |
|  21              'L input_masks',¬
 | |
|  22              'S pixel_width',¬
 | |
|  23              'S pixel_height',¬
 | |
|  24              'S mm_width',¬
 | |
|  25              'S mm_height',¬
 | |
|  26              'S min_installed_maps',¬
 | |
|  27              'S max_installed_maps',¬
 | |
|  28              'L root_visual',¬
 | |
|  29              'C root_depth',¬
 | |
|  30              'C backing_stores',¬
 | |
|  31              'C root_depth',¬
 | |
|  32              'C num_depths'¬
 | |
| 
 | |
| 
 | |
| per depth:
 | |
|   depth: [ 24, 80 ] (depth, num visuals)
 | |
| 
 | |
| per visual:
 | |
|   visual { vid: 146,
 | |
|   class: 4,
 | |
|   bits_per_rgb: 8,
 | |
|   map_ent: 256,
 | |
|   red_mask: 16711680,
 | |
|   green_mask: 65280,
 | |
|   blue_mask: 255 }
 | |
| 
 | |
| */
 | |
| 
 | |
|     //stream.pack('')
 | |
|     //  [2, reason,
 | |
|     //serv.pack_stream.unpack('C', function(isShared) {
 | |
|     //    console.log([isShared]);
 | |
|     //    serv.writeServerInit();
 | |
|     //});
 | |
|     //
 | |
|     var hello = Require('fs').readFileSync('hello1.bin');
 | |
|     stream.pack('CxSSSa', [1, 11, 0, hello.length/4, hello]);
 | |
|     stream.flush();
 | |
|     serv.expectMessage();
 | |
| }
 | |
| 
 | |
| XServerClientConnection.prototype.expectMessage = function()
 | |
| {
 | |
|     var serv = this;
 | |
|     console.log('expecting messages');
 | |
|     serv.pack_stream.unpack('CCS', function(header) {
 | |
|         serv.sequence++;
 | |
|         console.log('Request:', header[0]);
 | |
|         console.log('Extra:', header[1]);
 | |
|         console.log('length:', header[2]);
 | |
|         serv.pack_stream.get((header[2]-1)*4, function(reqBody) {
 | |
| 
 | |
|           console.log('BODY:', reqBody, reqBody.toString());
 | |
| 
 | |
|           if (header[0] == 98) {
 | |
|             serv.pack_stream.pack('CCSLCCCCLLLLL', [1, 0, serv.sequence, 0, 1, 134, 0, 0, 0, 0, 0, 0, 0, 0]);
 | |
|             serv.pack_stream.flush();
 | |
|           } else if (header[0] == 134) {
 | |
|             console.log('ENABLE BIG REQ');
 | |
|             serv.pack_stream.pack('CCSLLLLLLLL', [1, 0, serv.sequence, 0, 10000000, 0, 0, 0, 0, 0, 0 ]);
 | |
|             serv.pack_stream.flush();
 | |
|           }
 | |
|           serv.expectMessage();
 | |
| 
 | |
|         });
 | |
|     });
 | |
| }
 | |
| 
 | |
| module.exports.createServer = function(options, onconnect) {
 | |
|     if (typeof(options) === 'function') {
 | |
|         onconnect = options;
 | |
|         options = {};
 | |
|     }
 | |
|     var s = net.createServer();
 | |
|     var serv = new XServer(s, options);
 | |
|     serv.on('connect', onconnect);
 | |
|     return s;
 | |
| }
 | |
| 
 | |
| //module.exports.createServer(6002) ;
 | |
| //function(client) {
 | |
| //});
 |