/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: CAsyncServerSocket.java,v 1.5 2005/05/04 07:49:56 rampil Exp $
 */
package org.logical_paradox.common.net.async;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectableChannel;
import java.nio.channels.ServerSocketChannel;

/**
 * CAsyncServerSocket
 * 非同期サーバーソケット
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.5 $
 */
public abstract class CAsyncServerSocket extends CAsyncSocket {
	/** サーバーソケットの状態 */
	private boolean listening = false;
	/** listenしているポート番号 */
	private final int port_;

	/**
	 * コンストラクタ
	 * @param port ポート番号
	 * @throws IOException サーバーソケットの生成に失敗
	 */
	public CAsyncServerSocket(int port) throws IOException {
		port_ = port;
		channel = (SelectableChannel)ServerSocketChannel.open();
		((ServerSocketChannel)channel).socket().bind(new InetSocketAddress(port), 512);
	}
	/**
	 * サーバーソケットがlisteningしている状態かどうかを返す
	 * @return true: まだ生きている / false: 既にcloseされた
	 */
	public boolean isListening() {
		return listening;
	}
	/**
	 * サーバーソケットチャンネルをクローズする
	 * @throws IOException クローズに失敗した
	 */
	public void close() throws IOException {
		if(listening == true) {
			((ServerSocketChannel)channel).socket().close();
			listening = false;
		}
	}
	/**
	 * listenしているポート番号を返す
	 * @return ポート番号
	 */
	public int getPort() {
		return port_;
	}
	/**
	 * クライアントがサーバーに接続した場合に発生するイベントのハンドラ
	 * @param e 非同期イベント
	 */
	public void onConnect(AsyncEvent e) {
	}
	/**
	 * 接続相手から何かのデータを受信した際に発生するイベントのハンドラ
	 * @param e 非同期イベント
	 */
	public abstract void onReceive(AsyncEvent e);
	/**
	 * 接続相手に何かのデータを送信した際に発生するイベントのハンドラ
	 * @param e 非同期イベント
	 */
	public void onSend(AsyncEvent e) {
		super.onSend(e);
	}
	/**
	 * クライアントからの接続を受け付けた際に発生するイベントのハンドラ
	 * @param e 非同期イベント
	 */
	public abstract void onAccept(AsyncEvent e);
}

// end of CAsyncServerSocket.java
