// ServerController.cpp : アプリケーションのクラス動作を定義します。
//

#include "stdafx.h"
#include "ServerController.h"
#include "MainFrm.h"
#include "afxwin.h"
#include "Mmsystem.h"
#include "ClickedStatic.h"
#include ".\servercontroller.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CServerControllerApp

BEGIN_MESSAGE_MAP(CServerControllerApp, CWinApp)
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
	ON_COMMAND(ID_FILE_START, OnFileStart)
	ON_COMMAND(ID_FILE_LOAD, OnFileLoad)
	ON_COMMAND(ID_FILE_EXPORT, OnFileExport)
	ON_COMMAND(ID_HELP_MANUAL, OnHelpManual)
	ON_COMMAND(ID_HELP_HOMEPAGE, OnHelpHomepage)
END_MESSAGE_MAP()


// CServerControllerApp コンストラクション

CServerControllerApp::CServerControllerApp()
{
	m_wantRestart = 0;
}

CServerControllerApp::~CServerControllerApp()
{
}

// 唯一の CServerControllerApp オブジェクトです。

CServerControllerApp theApp;

// CServerControllerApp 初期化

BOOL CServerControllerApp::InitInstance()
{
	CoInitialize(NULL);
	InitCommonControls();
	CWinApp::InitInstance();

	// OLE ライブラリを初期化します。
	if (!AfxOleInit())
	{
		AfxMessageBox(IDP_OLE_INIT_FAILED);
		return FALSE;
	}
	AfxEnableControlContainer();
	SetRegistryKey(_T("Soft3304"));

	//	サーバのロード
	if(m_serverControl.LoadServerControl())
	{
		AfxMessageBox("サーバのCOMオブジェクトがロードできませんでした。\r\n04WebServer.exeが無いか破壊されている可能性があります。",MB_ICONSTOP);
		return FALSE;
	}

	LoadSetting();

	//	サーバ実行開始
	if(m_serverControl.IsRunning()==0)
		m_serverControl.StartServer();

	CMainFrame* pFrame = new CMainFrame;
	m_pMainWnd = pFrame;

	pFrame->LoadFrame(IDR_MAINFRAME,
		WS_OVERLAPPEDWINDOW, NULL,
		NULL);

	((CMainFrame *)pFrame)->PopWindowStat();
	((CMainFrame *)pFrame)->UpdateWindow();

	return TRUE;
}

//	モジュールパスを取得
CString CServerControllerApp::GetAppPath()
{
	char	s[MAX_PATH+1];
	DWORD len = GetModuleFileName(NULL, s, MAX_PATH);

	while ( s[len--]!='\\' && len!=0 )
		;
	s[len+2] = '\0';        // ￥マークで終わらせる

	return(s);
}

//	設定ロード
void CServerControllerApp::LoadSetting()
{
	//	設定環境領域を取得
	m_settingRoot.LoadFromFile(m_serverControl.GetServerRoot() + "04WebServer.xml");
	m_setting = m_settingRoot.GetAccess("Setting");
}

//	設定セーブ
void CServerControllerApp::SaveSetting()
{
	m_settingRoot.SaveToFile(m_serverControl.GetServerRoot() + "04WebServer.xml");
	m_wantRestart = 1;
	m_pMainWnd->Invalidate();
}

// CServerControllerApp メッセージ ハンドラ



// アプリケーションのバージョン情報に使われる CAboutDlg ダイアログ

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// ダイアログ データ
	enum { IDD = IDD_ABOUTBOX };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート
	
	CFont	m_bold;

// 実装
protected:
	DECLARE_MESSAGE_MAP()
public:
	CStatic m_label;
	afx_msg void OnStnClickedSoft3304();
	afx_msg void OnStnClickedLogo();
	virtual BOOL OnInitDialog();
	CString m_edit;
	CClickedStatic m_soft3304;
	CClickedStatic m_04webserver;
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
, m_edit(_T(""))
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LABEL, m_label);
	DDX_Text(pDX, IDC_LOG, m_edit);
	DDX_Control(pDX, IDC_SOFT3304, m_soft3304);
	DDX_Control(pDX, IDC_LOGO, m_04webserver);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	ON_STN_CLICKED(IDC_SOFT3304, OnStnClickedSoft3304)
	ON_STN_CLICKED(IDC_LOGO, OnStnClickedLogo)
END_MESSAGE_MAP()

//	初期化
BOOL CAboutDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	m_bold.CreateFont(12,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,
						SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
						DEFAULT_QUALITY,DEFAULT_PITCH,"");
	m_label.SetFont(&m_bold);


	//	ログの取得
	HRSRC res = FindResource(NULL,MAKEINTRESOURCE(IDR_UPDATE_LOG),"TEXT");
	int	size = SizeofResource(NULL,res);
	HGLOBAL data = LoadResource(NULL,res);

	if(data!=NULL)
	{
		char * buf = m_edit.GetBuffer(size + 1);
		memcpy(buf,data,size);
		buf[size] = 0;
		m_edit.ReleaseBuffer();
	}

	UpdateData(FALSE);

	return TRUE;  // return TRUE unless you set the focus to a control
	// 例外 : OCX プロパティ ページは必ず FALSE を返します。
}

//	バーナークリック１
void CAboutDlg::OnStnClickedSoft3304()
{
	GET_APP()->ClickSound();

	CString	url;
	url.LoadString(IDS_URL_SOFT3304);
	::ShellExecute(0, _T("open"), url.GetBuffer(0), 0, 0, SW_SHOWNORMAL);
}

//	バーナークリック２
void CAboutDlg::OnStnClickedLogo()
{
	GET_APP()->ClickSound();

	CString	url;
	url.LoadString(IDS_URL_04WEBSERVER);
	::ShellExecute(0, _T("open"), url.GetBuffer(0), 0, 0, SW_SHOWNORMAL);
}


// ダイアログを実行するためのアプリケーション コマンド
void CServerControllerApp::OnAppAbout()
{
	CAboutDlg aboutDlg;
	aboutDlg.DoModal();
}


// CServerControllerApp メッセージ ハンドラ


int CServerControllerApp::ExitInstance()
{
	//	サーバ停止
	if(m_serverControl.IsRunning() == 1 && m_serverControl.IsService() == 0)
		m_serverControl.StopServer();

	m_serverControl.ReleaseControl();
	CoUninitialize();
	return CWinApp::ExitInstance();
}

//	置き換え文字列を取得
CString	CServerControllerApp::GetPathSwap(CString path)
{
	CConfig			swap;
	CConfigAccess	swapAccess = swap.GetAccess("Swap");

	//	サーバーネーム
	swapAccess.SetConfig("ServerName","04WebServer");

	//	サーバールート
	swapAccess.SetConfig("ServerRoot",m_serverControl.GetServerRoot());

	return(swapAccess.GetKeySwapString(path));
}

//	設定退避
void CServerControllerApp::PushSetting()
{
	CConfigAccess	push = m_settingPush.GetAccess("Setting");
	push.Copy(m_setting);
}

//	設定復帰
void CServerControllerApp::PopSetting()
{
	CConfigAccess	pop = m_settingPush.GetAccess("Setting");
	m_setting.Copy(pop);
}


//	サーバ再起動
void CServerControllerApp::OnFileStart()
{
	m_serverControl.StartServer();
	m_wantRestart = 0;
	m_pMainWnd->Invalidate();
}

//	設定の読み込み
void CServerControllerApp::OnFileLoad()
{
	CFileDialog	fdialog(TRUE,".xml",NULL,0,"XML Files (*.xml)|*.xml||");

	if(fdialog.DoModal()!=IDOK)
		return;

	CConfig	load;
	if(load.LoadFromFile(fdialog.GetPathName()) || load.GetConfig("Setting::Basic::Port","")=="")
	{
		AfxMessageBox("ファイルが異常です。",MB_ICONSTOP);
		return;
	}

	//	設定環境領域を取得
	m_settingRoot.LoadFromFile(fdialog.GetPathName());
	m_setting = m_settingRoot.GetAccess("Setting");
	SaveSetting();
}

//	設定の保存
void CServerControllerApp::OnFileExport()
{
	CFileDialog	fdialog(FALSE,".xml","04WebServer.xml",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"XML Files (*.xml)|*.xml||");

	if(fdialog.DoModal()!=IDOK)
		return;

	m_settingRoot.SaveToFile(fdialog.GetPathName());
}


//	クリック音
void CServerControllerApp::ClickSound()
{
	::PlaySound((LPCSTR)IDR_CLICK,AfxGetApp()->m_hInstance,SND_RESOURCE | SND_ASYNC | SND_NODEFAULT);
}


//	マニュアルを表示
void CServerControllerApp::OnHelpManual()
{
	::ShellExecute(0, _T("open"), GET_APP()->GetAppPath() + "manual.html", 0, 0, SW_SHOWNORMAL);
}

//	ホームページへジャンプ
void CServerControllerApp::OnHelpHomepage()
{
	CString	url;
	url.LoadString(IDS_URL_04WEBSERVER);
	::ShellExecute(0, _T("open"), url.GetBuffer(0), 0, 0, SW_SHOWNORMAL);
}
