/*******************************************************************************
*	ファイル名：DataCollect.cpp
*	用　　　途：アプリケーションオブジェクトクラスの実装
*	備　　　考：
*	履　　　歴：
********************************************************************************/

/****************************
*	インクルードファイル	*
****************************/
#include "stdafx.h"
#include "DataCollect.h"
#include "MainFrm.h"
#include "DataCollectDoc.h"
#include "DataCollectView.h"

/****************************
*	　マクロ・定数定義		*
****************************/
#ifdef _DEBUG
#define new DEBUG_NEW
#endif


/****************************
*		 クラス実装			*
****************************/

/*******************************************************************************
*	ク ラ ス名：CDataCollectApp
*	用　　　途：メインアプリケーションクラス
*	備　　　考：
********************************************************************************/

//***** メッセージマップ
BEGIN_MESSAGE_MAP( CDataCollectApp, CWinApp )
//	ON_COMMAND(ID_APP_ABOUT, &CDataCollectApp::OnAppAbout)	// バージョン情報表示
//	// 標準のファイル基本ドキュメント コマンド
	ON_COMMAND( ID_FILE_NEW , &CWinApp::OnFileNew  )
	ON_COMMAND( ID_FILE_OPEN, &CWinApp::OnFileOpen )
END_MESSAGE_MAP()


/*******************************************************************************
*	関　数　名：CDataCollectApp
*	用　　　途：コンストラクタ
*	引　き　数：
*	戻　り　値：
*	備　　　考：
********************************************************************************/
CDataCollectApp::CDataCollectApp()
{
	// TODO: この位置に構築用コードを追加してください。
	// ここに InitInstance 中の重要な初期化処理をすべて記述してください。

	//***** 初期化待ちウェイトタイム
	{
		DWORD	dwWait_msec = STARTUP_WAIT_SECOND * 1000 ;
		//DWORD	dwWait_msec = STARTUP_WAIT_MINUTES * 60 * 1000 ;
		// GetTickCount()はPC起動時からの時間をmsecで返す
		while( ::GetTickCount() < dwWait_msec ){ 
			::Sleep( 100 ) ;
		}
	}

	//***** 二重起動防止(ミューテックス生成)
	{
		m_hAppLock = ::CreateMutexA( NULL, FALSE, APPTITLE _T("AppLock") ) ; 
		if( ::WaitForSingleObject(m_hAppLock, 0) == WAIT_TIMEOUT ){ 
			::CloseHandle( m_hAppLock ) ;
			m_hAppLock	= NULL ;
			AfxMessageBox( _T("既に起動しています！"), MB_OK ) ;
		}
	}
}


/*******************************************************************************
*	関　数　名：~CDataCollectApp
*	用　　　途：デストラクタ
*	引　き　数：
*	戻　り　値：
*	備　　　考：
********************************************************************************/
CDataCollectApp::~CDataCollectApp()
{
	//***** 二重起動防止ロック解除
	if( m_hAppLock != NULL ){  
		::ReleaseMutex( m_hAppLock ) ;
		::CloseHandle ( m_hAppLock ) ;
	}
}


/****************************
*	オブジェクト　宣言		*
****************************/
// 唯一の CDataCollectApp オブジェクトです。
CDataCollectApp theApp ;


/*******************************************************************************
*	関　数　名：InitInstance
*	用　　　途：アプリケーション起動時の初期化処理を行う
*	引　き　数：
*	戻　り　値：成功(TRUE) / 失敗(FALSE)
*	備　　　考：
********************************************************************************/
BOOL CDataCollectApp::InitInstance()
{
	// -------------------------------------------------------------------------
	//***** ２重起動防止
	if( m_hAppLock == NULL ){ 
		return FALSE ;
	}

	//***** プロセスヒープをローフラグメントヒープ化
	//		メモリの断片化を抑制
	//SetLFH() ;

	//***** ワーキングセットサイズの初期化
	InitWorkingSetSize() ;

	//***** 作業フォルダの構成
	ConstructWorkDirectory() ;

	// ログ管理クラス初期化
	CString strLogSettingFile ;
	strLogSettingFile.Format( _T("%s\\%s"), AbsPath(LOG_PATH), PARAM_LOG_FILE ) ;
	CDailyLogManagerS::GetInstance().Initialize( strLogSettingFile ) ;

	//***** メインスレッドの使用コアを１番目に限定する
	//::SetThreadToPhysicalProcessor( ::GetCurrentThread(), 0 ) ;

	// -------------------------------------------------------------------------

	// アプリケーション マニフェストが visual スタイルを有効にするために、
	// ComCtl32.dll Version 6 以降の使用を指定する場合は、
	// Windows XP に InitCommonControlsEx() が必要です。さもなければ、ウィンドウ作成はすべて失敗します。
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// アプリケーションで使用するすべてのコモン コントロール クラスを含めるには、
	// これを設定します。
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinApp::InitInstance();

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

	AfxEnableControlContainer();
	// 標準初期化
	// これらの機能を使わずに最終的な実行可能ファイルの
	// サイズを縮小したい場合は、以下から不要な初期化
	// ルーチンを削除してください。
	// 設定が格納されているレジストリ キーを変更します。
	// TODO: 会社名または組織名などの適切な文字列に
	// この文字列を変更してください。
	SetRegistryKey(_T("アプリケーション ウィザードで生成されたローカル アプリケーション"));
	LoadStdProfileSettings(4);  // 標準の INI ファイルのオプションをロードします (MRU を含む)
	// アプリケーション用のドキュメント テンプレートを登録します。ドキュメント テンプレート
	//  はドキュメント、フレーム ウィンドウとビューを結合するために機能します。
	CSingleDocTemplate* pDocTemplate;
	pDocTemplate = new CSingleDocTemplate(
		IDR_MAINFRAME,
		RUNTIME_CLASS(CDataCollectDoc),
		RUNTIME_CLASS(CMainFrame),       // メイン SDI フレーム ウィンドウ
		RUNTIME_CLASS(CDataCollectView));
	if (!pDocTemplate)
		return FALSE;
	AddDocTemplate(pDocTemplate);

	// DDE、file open など標準のシェル コマンドのコマンド ラインを解析します。
	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);

	// コマンド ラインで指定されたディスパッチ コマンドです。アプリケーションが
	// /RegServer、/Register、/Unregserver または /Unregister で起動された場合、False を返します。
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;

	// -------------------------------------------------------------------------
	//***** タイトルバーの表示
	{
		CString		strTitleBarText ;
		CDataCollectDoc* pDoc = (CDataCollectDoc*)GetDocument();
		pDoc = NULL;

		strTitleBarText.Format( _T("%s-%s Ver%s(%s)"), APPTITLE, APPPLATFORM, APPVERDATE, APPMODE) ; 
		m_pMainWnd->SetWindowText( strTitleBarText ) ; 
	}
	// -------------------------------------------------------------------------

	// メイン ウィンドウが初期化されたので、表示と更新を行います。
	m_pMainWnd->ShowWindow(SW_SHOW);
	m_pMainWnd->UpdateWindow();
	// 接尾辞が存在する場合にのみ DragAcceptFiles を呼び出してください。
	//  SDI アプリケーションでは、ProcessShellCommand の直後にこの呼び出しが発生しなければなりません。
	return TRUE;
}


/*******************************************************************************
*	関　数　名：ExitInstance
*	用　　　途：アプリケーション終了時の初期化処理を行う
*	引　き　数：
*	戻　り　値：アプリケーション終了コード
*	備　　　考：
********************************************************************************/
int CDataCollectApp::ExitInstance()
{
	return CWinApp::ExitInstance() ;
}


/*******************************************************************************
*	関　数　名：InitWorkingSetSize
*	用　　　途：アプリケーションで使用するメモリ空間サイズを初期設定する
*	引　き　数：
*	戻　り　値：
*	備　　　考：ワーキングセットサイズの指定はnew等のメモリ割り当てに影響
*				します
********************************************************************************/
void CDataCollectApp::InitWorkingSetSize()
{
	SIZE_T		uiMinSize = 0 ;				// 最小要求サイズ
	SIZE_T		uiMaxSize = 0 ;				// 最大要求サイズ

	BOOL		bResult ;
	HANDLE		hProcess ;

	hProcess	= ::GetCurrentProcess() ;
	bResult		= ::GetProcessWorkingSetSize( hProcess, &uiMinSize, &uiMaxSize ) ;

	//***** 現在の値に拡張分を上乗せして設定する
	uiMinSize  += (SIZE_T)( APP_WORKINGSET_MIN_SIZE ) ;
	uiMaxSize  += (SIZE_T)( APP_WORKINGSET_MAX_SIZE ) ;

	bResult		= ::SetProcessWorkingSetSize( hProcess,  uiMinSize, uiMaxSize ) ;

	// hProcessはCloseHandleで返却する必要のない擬似ハンドルです。
}


/*******************************************************************************
*	関　数　名：ConstructWorkDirectory
*	用　　　途：作業フォルダの構成
*	引　き　数：
*	戻　り　値：
*	備　　　考：
********************************************************************************/
void CDataCollectApp::ConstructWorkDirectory()
{
	//***** 作業フォルダ(メインフォルダ)
	::CreateDirectoryA( ::AbsPath( TMP_PATH	  ), NULL ) ;	// Tmpフォルダ
	::CreateDirectoryA( ::AbsPath( LOG_PATH	  ), NULL ) ;	// Logフォルダ
	::CreateDirectoryA( ::AbsPath( PARAM_PATH ), NULL ) ;	// パラメータフォルダ
	
	//***** 参照関連サブフォルダ

}

/*******************************************************************************
*	用　　　途：アプリケーションのバージョン情報に使われる CAboutDlg ダイアログ
*	備　　　考：
*	履　　　歴：
********************************************************************************/

/****************************
*		 クラス実装			*
****************************/
// バージョン情報ダイアログメッセージマップ
//BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//END_MESSAGE_MAP()


/*******************************************************************************
*	関　数　名：DoDataExchange
*	用　　　途：ダイアログデータ交換を行う
*	引　き　数：データ交換オブジェクト
*	戻　り　値：
*	備　　　考：
********************************************************************************/
//void CAboutDlg::DoDataExchange(CDataExchange* pDX)
//{
//	CDialog::DoDataExchange(pDX);
//}


/*******************************************************************************
*	関　数　名：OnAppAbout
*	用　　　途：ダイアログを実行するためのアプリケーション コマンド
*	引　き　数：
*	戻　り　値：
*	備　　　考：
********************************************************************************/
//void CDataCollectApp::OnAppAbout()
//{
//	CAboutDlg aboutDlg;
//	aboutDlg.DoModal();
//}

/********************************************************************************
*	関　数　名：GetDocument														*
*	用　　　途：アクティブなドキュメントの取得									*
*	引　き　数：																*
*	戻　り　値：ドキュメント													*
*	備　　　考：																*
********************************************************************************/
CDocument* CDataCollectApp::GetDocument()
{
	CFrameWnd	*pMainWnd;
	CView		*pView;
	CDocument	*pDoc;

	pMainWnd = (CFrameWnd *)(((CDataCollectApp*)AfxGetApp())->m_pMainWnd);

	if (pMainWnd == 0)
	{
		return 0;
	}

	pView = pMainWnd->GetActiveView();
	pDoc = pView->GetDocument();

	return	pDoc;
}

