view src/fdl/PSX.java @ 20:a0fd653d1121

Debug Client and Meta Engine for logging.
author kono
date Tue, 19 Aug 2008 06:26:20 +0900
parents 0243987383b7
children 56e015e8f5dc
line wrap: on
line source


/*
 * @(#)PSXQueueInterface.java       1.1 06/04/01
 *
 * Copyright 2006  Shinji KONO
 * 

   PSX Lidna
     Trasport layer of PSX Linda library

 */

package fdl;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;



/**
  PSX Tuple Command Protocol Format

	All PSX offseted command operation should be here.
 */

public class PSX {
    static final int PSX_IN =		'i';
    static final int PSX_OUT =		'o';
    static final int PSX_UPDATE =	'u';
    static final int PSX_RD =		'r';
    static final int PSX_CHECK =	'c';
    static final int PSX_REPLY =	'?';
    static final int PSX_WAIT_RD =	'w';
    static final int PSX_ANSWER =	'a';
    static final int PSX_HTTP_ANSWER =	'P';   // Put
    static final int PSX_HTTP_REQUEST =	'G';  // Get
    static final int PSX_COM_DEBUG = 'D';  //Communication DEBUG
    
    static final int LINDA_PACKET_LENGTH_OFFSET	=0;
    static final int LINDA_MODE_OFFSET          =0+4;
    static final int LINDA_ID_OFFSET            =1+4;
    static final int LINDA_SEQ_OFFSET           =3+4;
    static final int LINDA_DATA_LENGTH_OFFSET   =7+4;
    static final int LINDA_HEADER_SIZE          =12+4;
    static final int INT_SIZE          =4;
    static final int SHORT_SIZE          =2;
    
    static final int PRIVILEGED_ID_START   = 32768;
    static final int PRIVILEGED_ID_END   = 36864;
	static final int META_STOP = PRIVILEGED_ID_START;
	static final int META_MONITOR = PRIVILEGED_ID_START+1;
	static final int META_MONITOR_DATA = PRIVILEGED_ID_START+2;
    
    // this method should be removed
	static void setReportCommand(ByteBuffer command, String report_txt) {
		command.order(ByteOrder.BIG_ENDIAN);
		command.putInt(LINDA_PACKET_LENGTH_OFFSET,(report_txt).length()*2+LINDA_HEADER_SIZE-INT_SIZE);
		command.put(LINDA_MODE_OFFSET,(byte)'D');
		command.putShort(LINDA_ID_OFFSET,(short) 0);
		command.putInt(LINDA_SEQ_OFFSET,0);
		command.putInt(LINDA_DATA_LENGTH_OFFSET,(report_txt).length()*2);
		command.rewind();
	}
	
	static void printCommand(ByteBuffer command, ByteBuffer data) {
		char id = (char)command.getShort(LINDA_ID_OFFSET);
		System.out.println("LENGTH:"+command.getInt(LINDA_PACKET_LENGTH_OFFSET)+" "+
				"MODE:"+(char)command.get(LINDA_MODE_OFFSET)+" "+
				"ID:"+(int)id+" "+
				"SEQ:"+command.getInt(LINDA_SEQ_OFFSET)+" "+
				"DATA LENGTH:"+command.getInt(LINDA_DATA_LENGTH_OFFSET)+" ");
		System.out.println("DATA:"+data);
		command.rewind();
	}
	
	static void printData(ByteBuffer command) {
		/*** print data ***/
		char id = (char)command.getShort(LINDA_ID_OFFSET);
		System.out.println("LENGTH:"+command.getInt(LINDA_PACKET_LENGTH_OFFSET)+" "+
				"MODE:"+(char)command.get(LINDA_MODE_OFFSET)+" "+
				"ID:"+(int)id+" "+
				"SEQ:"+command.getInt(LINDA_SEQ_OFFSET)+" ");
		command.rewind();
	}
	
	
	static void setCommand(ByteBuffer command, int _mode, int _id, int _seq, int _datalen) {
		command = ByteBuffer.allocate(LINDA_HEADER_SIZE);
		command.order(ByteOrder.BIG_ENDIAN);
	
		command.putInt(LINDA_PACKET_LENGTH_OFFSET,
					_datalen+LINDA_HEADER_SIZE-INT_SIZE);
		command.put(LINDA_MODE_OFFSET,(byte)_mode);
		command.putShort(LINDA_ID_OFFSET,(short)_id);
		command.putInt(LINDA_SEQ_OFFSET,_seq);
		command.putInt(LINDA_DATA_LENGTH_OFFSET,_datalen);
		command.rewind();
	}

	static void setAnserCommand(ByteBuffer command, int seq) {
		command.put(LINDA_MODE_OFFSET, (byte)'a');
		command.rewind();
		command.putInt(LINDA_SEQ_OFFSET, seq);
		command.rewind();
	}

	public static ByteBuffer string2ByteBuffer(String log) {
		ByteBuffer blog = ByteBuffer.allocate(log.length()*2); // this is incorrect...
		for(int i=0;i<log.length();i++) {
			blog.putChar(log.charAt(i));
		}
		blog.flip();
		return blog;
	}

	public static String getdataString(ByteBuffer data) {
		String sendtext;
		data.rewind();
		//Decode UTF-8 to System Encoding(UTF-16) 
		Charset charset = Charset.forName("UTF-8");
		CharsetDecoder decoder = charset.newDecoder();
		CharBuffer cb = null;
		try {
			cb = decoder.decode(data);
		} catch (CharacterCodingException e) {
			e.printStackTrace();
		}
		cb.rewind();
	
		sendtext = cb.toString();
		return sendtext;
	}
    

}

/* end */