// nlite.cpp : アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "nlite_include.h"
using namespace nlite;
CAppModule _Module;






static WSAData wsaData;							//winsockdata
static HINTERNET hInternet = NULL;

static BOOL InitializeNlite();					//アプリケーション初期化
static VOID FinalizeNlite();					//アプリケーション終了処理
static CNliteMainFrame wnd;						//メインフレームウィンドウ

//メイン関数
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE,
	LPTSTR lpCmdLine, int nCmdShow)
{
	HINSTANCE hRich = LoadLibrary(CRichEditCtrl::GetLibraryName());
	int nRet = -1;
	try{

		//
		//アプリケケーション初期化処理
		//
		HRESULT hRes = ::CoInitialize(NULL);
		ATLASSERT(SUCCEEDED(hRes));
		AtlInitCommonControls(ICC_COOL_CLASSES | ICC_WIN95_CLASSES);
		GUID guid;
		if(_Module.Init(NULL, hInstance,&guid) != S_OK){
			throw AppInitException(__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
		}

		AtlAxWinInit();

		if(InitializeNlite() != TRUE){
			throw AppInitException(__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
		}

		

		
		//メッセージループ登録
		CMessageLoop theLoop;
		_Module.AddMessageLoop(&theLoop);


		//メインウィンドウ初期化
		wnd.Initialize(localAppDataPath);
		wnd.CreateEx(0,0,WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN);

		//メインウィンドウ表示
		wnd.ShowWindow(nCmdShow);
		wnd.UpdateWindow();

		//余分に確保しているヒープを開放
		_heapmin();


		//メッセージループ開始
		nRet = theLoop.Run();

		//終了後メモリチェック
		vcassert(_heapchk() == _HEAPOK,TEXT("ヒープエラーです"));

		goto nliteend;

	} catch(nlite::Exception &e){

		UnexpectedErrorMessageShow(TEXT("ハンドルされていないエラー"),e.what(),e.getLineNo(),e.getFileName(),e.getFunctionName());


		goto nlitefinally;
	} catch(nlib::Exception &e){

		UnexpectedErrorMessageShow(TEXT("nlibでハンドルされていないエラー"),e.what(),e.getLineNo(),e.getFileName(),e.getFunctionName());

		goto nlitefinally;
	}catch(std::exception &e){
		UnexpectedErrorMessageShow(TEXT("ハンドルされていないエラー"),CComBSTR(e.what()),-1,TEXT("発生ファイルが特定出来ません"),TEXT("発生関数が特定できません"));



		goto nlitefinally;
	} 

nlitefinally:
	wnd.OnException();
	wnd.DestroyWindow();
	FreeLibrary(hRich);

nliteend:

	_Module.RemoveMessageLoop();
	FinalizeNlite();
	_Module.Term();
	::CoUninitialize();

	return nRet;
}

static BOOL InitializeNlite(){

	BOOL rslt = FALSE;

	try{

		nlite::appInfo = &CApplicationInfo::getInstance();
		INT_PTR err;
		INT_PTR count = 0;

		//WSADataを初期化
		while((err = WSAStartup(MAKEWORD(2,0),&wsaData)) == WSASYSNOTREADY){

			count++;
			if(count >= 5)break;
			Sleep(500);



		}

		if(err != ERROR_SUCCESS){

			throw AppInitException(__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
		}

		//アプリケーション情報インスタンス生成
		const CApplicationInfo &appInfo = CApplicationInfo::getInstance();
		CNLiteString userAgent;
		userAgent = appInfo.getProcuctName();
		userAgent += TEXT("/");
		userAgent += appInfo.getProductVersion();



		//HTTPオブジェクト生成
		hInternet = WinHttpOpen(userAgent,WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,(LPCWSTR)WINHTTP_NO_PROXY_NAME,(LPCWSTR)WINHTTP_NO_PROXY_BYPASS,0);

		if(hInternet == NULL){

			throw AppInitException(__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));

		}

		//nlibの初期化
		InitializeNLIB(hInternet);

		//ローカルアプリケーションフォルダ検索
		if(SHGetFolderPathW(0,CSIDL_LOCAL_APPDATA,0,SHGFP_TYPE_CURRENT,localAppDataPath) != S_OK){

			throw AppInitException(__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
		}


		SystemParametersInfo (SPI_SETLISTBOXSMOOTHSCROLLING,FALSE,FALSE,0);



		if(SHGetFolderPathW(0,CSIDL_APPDATA,0,SHGFP_TYPE_CURRENT,appFolderPath) != S_OK){

			throw AppInitException(__LINE__,TEXT(__FILE__),TEXT(__FUNCTION__));
		}
		ncvAppSettingPath = appFolderPath;
		ncvAppSettingPath += TEXT("\\posite-c\\NiconamaCommentViewer\\AppSetting.xml");
		rslt = TRUE;
	}catch (AppInitException e){

		rslt = FALSE;

	}
	

	return rslt;
}


VOID FinalizeNlite(){

	//メインフレームウィンドウ後処理
	wnd.Finalaize();

	//nlib後処理
	FinalizeNLIB();

	//HTTPオブジェクト開放
	WinHttpCloseHandle(hInternet);

	//winsock開放
	WSACleanup();

	return;
}

