#include "StdAfx.h"
#include "serverinfoview.h"
#include "ServerController.h"

#define	TEXT_LEFT	2

CServerInfoView::CServerInfoView(void)
{
}

CServerInfoView::~CServerInfoView(void)
{
}
BEGIN_MESSAGE_MAP(CServerInfoView, CMainViewBase)
	ON_WM_PAINT()
	ON_WM_CREATE()
	ON_WM_TIMER()
END_MESSAGE_MAP()

void CServerInfoView::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	DrawAll(&dc);
}

//	再描画
void CServerInfoView::DrawAll(CDC *dc)
{
	dc->SetBkMode(TRANSPARENT);

	//	起動状況
	if(GET_APP()->m_serverControl.IsRunning())
	{
		SetInfoActive(TRUE);
		DrawText(dc,TEXT_LEFT,10,"■サーバ動作状況",GET_APP()->m_serverControl.GetServerErrorString());
	}
	else
	{
		SetInfoActive(FALSE);
		DrawText(dc,TEXT_LEFT,10,"■サーバ動作状況","起動エラー : " + GET_APP()->m_serverControl.GetServerErrorString(),TRUE);
	}

	//	詳細情報
	if(GET_APP()->m_serverControl.IsRunning())
	{
		CConfig	infoRoot;
		infoRoot.FromString(GET_APP()->m_serverControl.GetServerInfo());
		CConfigAccess info = infoRoot.GetAccess("ServerInfo");

		//	シグニチャ取得
		CString ServerSignature = info.GetConfig("ServerName","") + "/" + info.GetConfig("ServerVersion","");
		if(ServerSignature != info.GetConfig("ServerSignature",""))
			ServerSignature += " (" + info.GetConfig("ServerSignature","") + ")";

		DrawText(dc,TEXT_LEFT,50 ,"■サーバ・バージョン", ServerSignature);
		if(GET_APP()->m_serverControl.IsService())
			DrawText(dc,TEXT_LEFT,90 ,"■サーバ・タイプ","システム サービス");
		else
			DrawText(dc,TEXT_LEFT,90 ,"■サーバ・タイプ","スタンドアロン アプリケーション");
		DrawText(dc,TEXT_LEFT,130 ,"■サーバ・ルート",info.GetConfig("ServerRoot",""));

		DrawText(dc,TEXT_LEFT,190,"■現在処理中の接続数",info.GetConfig("CurrentConnection","0") + " 接続");
		DrawText(dc,TEXT_LEFT,230,"■サーバが起動してから現在までの接続数",info.GetConfig("AllConnected","0") + " 接続");

		__int64	send = _atoi64(info.GetConfig("AllSendSize","0"));
		__int64	recv = _atoi64(info.GetConfig("AllRecvSize","0"));
		DrawText(dc,TEXT_LEFT,270,"■サーバが起動してから現在までの合計転送量",GetTransText(send,recv));
	
		DrawText(dc,TEXT_LEFT,310,"■過去１時間の接続数",info.GetConfig("Connected1Hour","0") + " 接続");

		send = _atoi64(info.GetConfig("SendSize1Hour","0"));
		recv = _atoi64(info.GetConfig("RecvSize1Hour","0"));
		DrawText(dc,TEXT_LEFT,350,"■過去１時間の合計転送量",GetTransText(send,recv));
	}
}


//	書式化された文字列取得
CString CServerInfoView::GetTransText(__int64 send,__int64 recv)
{
	CString	line,str;

	if(send < 10240)
		str.Format("送信容量 : %d バイト、",send);
	else if(send < 10485760L)
		str.Format("送信容量 : %d Kバイト、",send/1024);
	else if(send < 10737418240L)
		str.Format("送信容量 : %d Mバイト、",send/1048576L);
	else
		str.Format("送信容量 : %d Gバイト、",send/1073741824L);
	line = str;

	if(recv < 10240)
		str.Format("受信容量 : %d バイト",recv);
	else if(recv < 10485760L)
		str.Format("受信容量 : %d Kバイト",recv/1024);
	else if(recv < 10737418240L)
		str.Format("受信容量 : %d Mバイト",recv/1048576L);
	else
		str.Format("受信容量 : %d Gバイト",recv/1073741824L);
	line += str;

	return(line);
}

//	テキスト出力
void CServerInfoView::DrawText(CDC *dc,int x,int y,CString label,CString text,int alert)
{
	CFontSelector bold(dc,GET_GDI().m_fBold);

	dc->SetTextColor(TEXT_COLOR_BLUE);
	dc->TextOut(x,y,label);

	CFontSelector normal(dc,GET_GDI().m_fNormal);
	if(alert)
		dc->SetTextColor(TEXT_COLOR_RED);
	else
		dc->SetTextColor(TEXT_COLOR_BLACK);
	EraseText(x + 14,y + 16,dc);
	dc->TextOut(x + 14,y + 16,text);
}


void CServerInfoView::EraseText(int x,int y,CDC *dc)
{
	CRect	client;
	GetClientRect(client);

	CRect	r(x,y,client.right,y+16);
	dc->FillSolidRect(r,TEXT_COLOR_WHITE);
}

int CServerInfoView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CMainViewBase::OnCreate(lpCreateStruct) == -1)
		return -1;

	SetTimer(200,1000,NULL);

	return 0;
}

void CServerInfoView::OnTimer(UINT nIDEvent)
{
	//	最小化中は更新しない
	if(!AfxGetApp()->GetMainWnd()->IsIconic())
	{
		CClientDC 	dc(this);
		DrawAll(&dc);
	}

	CMainViewBase::OnTimer(nIDEvent);
}

//	文字列に
CString CServerInfoView::ToString()
{
	CString	text;

	CConfig	infoRoot;
	infoRoot.FromString(GET_APP()->m_serverControl.GetServerInfo());
	CConfigAccess info = infoRoot.GetAccess("ServerInfo");

	text += "■サーバ動作状況\r\n　";
	text += GET_APP()->m_serverControl.GetServerErrorString();
	text += "\r\n\r\n";

	text += "■サーバ・バージョン\r\n　";
	text += info.GetConfig("ServerSignature","");
	text += "\r\n\r\n";

	if(GET_APP()->m_serverControl.IsService())
		text += "■サーバ・タイプ\r\n　システム サービス\r\n\r\n";
	else
		text += "■サーバ・タイプ\r\n　スタンドアロン アプリケーション\r\n\r\n";

	text += "■サーバ・ルート\r\n　";
	text += info.GetConfig("ServerRoot","");
	text += "\r\n\r\n";

	text += "■現在処理中の接続数\r\n　";
	text += info.GetConfig("CurrentConnection","0");
	text += "\r\n\r\n";

	text += "■サーバが起動してから現在までの接続数\r\n　";
	text += info.GetConfig("AllConnected","0");
	text += "\r\n\r\n";

	__int64	send = _atoi64(info.GetConfig("AllSendSize","0"));
	__int64	recv = _atoi64(info.GetConfig("AllRecvSize","0"));

	text += "■サーバが起動してから現在までの合計転送量\r\n　";
	text += GetTransText(send,recv);
	text += "\r\n\r\n";

	text += "■過去１時間の接続数\r\n　";
	text += info.GetConfig("Connected1Hour","0") + " 接続";
	text += "\r\n\r\n";

	text += "■過去１時間の合計転送量\r\n　";
	text += GetTransText(send,recv);
	text += "\r\n\r\n";

	return(text);
}

