////////////////////////////////////////////////////////////////////////////
// TaEditSvr.cc
// 主筆サーバ
////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "Server.h"
#include "SyInstance.h"

int main( int argc, char *argv[] )
{
	CServer *pServer = NULL;
	CSyInstance *pInstanceMgr = NULL;
	struct stat wStat;
	int fd;
	int r = 1;

	// 引数の数を確認
	if ( argc <= 2 ) {
		fprintf( stderr, "Syuhitu server.\n" );
		fprintf( stderr, "\t%s <File Name> <File Discripter>\n", argv[0] );
		return 1;
	}

	// 指定されたファイルディスクリプタを確認
	fd = atoi( argv[2] );
	if ( fstat( fd, &wStat ) ) {
		fprintf( stderr, "ERROR Syuhitu server : File Discripter %d is not valid.\n", fd );
		return 1;
	}

	// 主筆インスタンス管理オブジェクトを構築
	pInstanceMgr = new CSyInstance();
	if ( NULL == pInstanceMgr ) {
		fprintf( stderr, "ERROR Syuhitu server : Out of memory.\n" );
		goto ON_EXIT;
	}
	if ( !pInstanceMgr->Initialize() )
		goto ON_EXIT;

	// サーバ管理オブジェクトを構築
	pServer = new CServer( pInstanceMgr );
	if ( NULL == pServer ) {
		fprintf( stderr, "ERROR Syuhitu server : Out of memory.\n" );
		goto ON_EXIT;
	}

	// サーバ処理を開始
	if ( !pServer->StartServer( argv[1], fd ) ) {
		// 異常終了した場合は、起動プロセスにその旨を通知してやる
		write( fd, "err\n", 4 );
		goto ON_EXIT;
	}
	r = 0;

ON_EXIT:

	// サーバ管理オブジェクトを破棄
	delete pServer;
	pServer = NULL;

	// 主筆インスタンス管理オブジェクトを破棄
	delete pInstanceMgr;
	pInstanceMgr = NULL;

	return r;
}

