#include "StdAfx.h"
#include "AddAuthorizedApp.h"
#pragma comment(lib,"comsuppw.lib")



///////////////////////////////////////////////////////////////////////////////////////////////////
//	公開メソッド
///////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	例外を追加
*/
void CAddAuthorizedApp::AddAppToFW(CString appName, CString appPath)
{
	//	まずは削除
	DelAppFromFW(appPath);

	//	INetFwMgrを生成
	CComPtr<INetFwMgr>	netFwMgr;
	HRESULT hResult = ::CoCreateInstance((REFCLSID)CLSID_NetFwMgr, 0, CLSCTX_INPROC_SERVER, (REFIID)IID_INetFwMgr, (LPVOID*)&netFwMgr);
	if(!SUCCEEDED(hResult))
		ThrowException(_T("INetFwMgrが取得できません"));

	//	ポリシー取得
	CComPtr<INetFwPolicy>	localPolicy;
	hResult = netFwMgr->get_LocalPolicy(&localPolicy);
	if(!SUCCEEDED(hResult))
		ThrowException(_T("INetFwPolicyが取得できません"));

	//	プロファイル取得
	CComPtr<INetFwProfile>	netFwProfile;
	hResult = localPolicy->get_CurrentProfile(&netFwProfile);
	if(!SUCCEEDED(hResult))
		ThrowException(_T("INetFwProfileが取得できません"));

	//	NetFwAuthorizedApplications 取得
	CComPtr<INetFwAuthorizedApplications>	netAuthApps;
	hResult = netFwProfile->get_AuthorizedApplications(&netAuthApps);
	if(!SUCCEEDED(hResult))
		ThrowException(_T("INetFwAuthorizedApplicationsが取得できません"));
		
	//	INetFwAuthorizedApplicationを生成
	CComPtr<INetFwAuthorizedApplication>	netAuthApp;
	hResult = ::CoCreateInstance((REFCLSID)CLSID_NetFwAuthorizedApplication, 0, CLSCTX_INPROC_SERVER, (REFIID)IID_INetFwAuthorizedApplication, (LPVOID*)&netAuthApp);
	if(!SUCCEEDED(hResult))
		ThrowException(_T("INetFwAuthorizedApplicationが取得できません"));
	
	//	パラメタ設定
	hResult = netAuthApp->put_Name(_bstr_t(appName));
	if(!SUCCEEDED(hResult))
		ThrowException(_T("ルールの追加に失敗しました"));
	hResult = netAuthApp->put_ProcessImageFileName(_bstr_t(appPath));
	if(!SUCCEEDED(hResult))
		ThrowException(_T("ルールの追加に失敗しました"));

	//	追加
	hResult = netAuthApps->Add(netAuthApp);
	if(!SUCCEEDED(hResult))
		ThrowException(_T("ルールの追加に失敗しました"));
	TRACE(_T("ルールを追加しました\n"));
}

/*!
	例外を削除
*/
void CAddAuthorizedApp::DelAppFromFW(CString appPath)
{
	//	INetFwMgrを生成
	CComPtr<INetFwMgr>	netFwMgr;
	HRESULT hResult = ::CoCreateInstance((REFCLSID)CLSID_NetFwMgr, 0, CLSCTX_INPROC_SERVER, (REFIID)IID_INetFwMgr, (LPVOID*)&netFwMgr);
	if(!SUCCEEDED(hResult))
		ThrowException(_T("INetFwMgrが取得できません"));

	//	ポリシー取得
	CComPtr<INetFwPolicy>	localPolicy;
	hResult = netFwMgr->get_LocalPolicy(&localPolicy);
	if(!SUCCEEDED(hResult))
		ThrowException(_T("INetFwPolicyが取得できません"));

	//	プロファイル取得
	CComPtr<INetFwProfile>	netFwProfile;
	hResult = localPolicy->get_CurrentProfile(&netFwProfile);
	if(!SUCCEEDED(hResult))
		ThrowException(_T("INetFwProfileが取得できません"));

	//	NetFwAuthorizedApplications 取得
	CComPtr<INetFwAuthorizedApplications>	netAuthApps;
	hResult = netFwProfile->get_AuthorizedApplications(&netAuthApps);
	if(!SUCCEEDED(hResult))
		ThrowException(_T("INetFwAuthorizedApplicationsが取得できません"));

	//	存在を確認
	CComPtr<INetFwAuthorizedApplication>	netAuthApp;
	hResult = netAuthApps->Item(_bstr_t(appPath), &netAuthApp);
	if(SUCCEEDED(hResult))
	{
		//	削除
		hResult = netAuthApps->Remove(_bstr_t(appPath));
		if(!SUCCEEDED(hResult))
			ThrowException(_T("ルールの削除に失敗しました"));
		TRACE(_T("ルールを削除しました\n"));
	}
	else if(hResult != HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND))
		ThrowException(_T("ルールの削除に失敗しました"));
}

/*!
	INetFwMgrが使えるかチェック
*/
bool CAddAuthorizedApp::CanUse()
{
	CComPtr<INetFwMgr>	netFwMgr;
	HRESULT hResult = ::CoCreateInstance((REFCLSID)CLSID_NetFwMgr, 0, CLSCTX_INPROC_SERVER, (REFIID)IID_INetFwMgr, (LPVOID*)&netFwMgr);
	if(!SUCCEEDED(hResult))
	{
		TRACE("Can not use INetFwMgr\n");
		return FALSE;
	}

	TRACE("Can use INetFwMgr\n");
	return TRUE;
}



/*!
	エラーを投げる
*/
void CAddAuthorizedApp::ThrowException(CString errorInfo)
{
	TRACE(_T("Error : %s\n"), errorInfo);
	throw CAddAuthorizedAppException(errorInfo);
}
