#include "StdAfx.h"
#include "MimeTypeManager.h"
#include "TextTools.h"
#include "SettingTextParser.h"

#define	CLASS_NAME		"MimeTypeManager"
#define	MAX_OPT_INDEX	10	//	最適化を行う最大インデックス

CMimeTypeManager::CMimeTypeManager(void)
{
}

CMimeTypeManager::~CMimeTypeManager(void)
{
	Stop();
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//	操作
///////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	開始
*/
void CMimeTypeManager::Start(CIServerToolWrap serverTool)
{
	ASSERT(!m_init);
	m_init = TRUE;

	//	取得
	m_serverTool = serverTool;
	m_mimeTypeSetting = m_serverTool.GetManagerSetting(m_mimeTypeSetting.GetSettingName());

	//	MimeType
	LoadMimeType();

	//	MimeTypeIcon
	LoadIcon();

	//	インターフェース登録
	m_serverTool.RegisterManagerInterface(CIMimeTypeManagerWrap::GetInterfaceName(), this);
}

/*!
	停止
*/
void CMimeTypeManager::Stop()
{
	//	初期化チェック
	if(!m_init)
		return;
	m_init = FALSE;

	//	インターフェース登録解除
	m_serverTool.UnRegisterManagerInterface(CIMimeTypeManagerWrap::GetInterfaceName(), this);
}

///////////////////////////////////////////////////////////////////////////////////////////
//	ツール関数
///////////////////////////////////////////////////////////////////////////////////////////
/*!
	MimeTypeをロード
*/
void CMimeTypeManager::LoadMimeType()
{
	//	取得
	CSettingTextParserItemArray	parse;
	CSettingTextParser::ParseText(m_mimeTypeSetting.GetMimeTypeText(), parse);
	if(parse.IsEmpty())
	{
		m_serverTool.WriteSystemLog(CLASS_NAME, SERVER_STATUS_WARNING, "MimeTypeの設定がひとつもありません");
		return;
	}

	//	変換
	for(int i=0;i<parse.GetCount();i++)
	{
		parse[i].m_keyText.Trim();
		if(!parse[i].m_keyText.IsEmpty())
		{
			CStringArray	&exts = parse[i].m_dataArray;
			for(int j=0;j<exts.GetCount();j++)
			{
				exts[j].Trim();
				if(!exts[j].IsEmpty())
					m_mimeTypeMap.SetAt(exts[j].MakeLower(), parse[i].m_keyText);
			}
		}
	}
}

/*!
	Iconをロード
*/
void CMimeTypeManager::LoadIcon()
{
	//	取得
	CSettingTextParserItemArray	parse;
	CSettingTextParser::ParseText(m_mimeTypeSetting.GetMimeTypeIcocText(), parse);
	if(parse.IsEmpty())
	{
		m_serverTool.WriteSystemLog(CLASS_NAME, SERVER_STATUS_WARNING, "ファイル アイコンの設定がひとつもありません");
		return;
	}

	//	変換
	m_iconArray.RemoveAll();
	for(int i=0;i<parse.GetCount();i++)
	{
		parse[i].m_keyText.Trim();
		if(!parse[i].m_keyText.IsEmpty())
		{
			CStringArray	&mimeExts = parse[i].m_dataArray;
			for(int j=0;j<mimeExts.GetCount();j++)
			{
				mimeExts[j].Trim();
				if(!mimeExts[j].IsEmpty())
					m_iconArray.Add(mimeExts[j].MakeLower(), parse[i].m_keyText);
			}
		}
	}
}


///////////////////////////////////////////////////////////////////////////////////////////
//	インターフェース
///////////////////////////////////////////////////////////////////////////////////////////
/*!
	拡張子からMimeTypeを取得する
*/
CString CMimeTypeManager::GetMimeTypeByName(CString name)
{
	SCOPE_LOCK();

	//	拡張子取得
	int index=name.ReverseFind('.');
	if(index == -1)
		return("application/octet-stream");
	CString ext = name.Mid(index + 1).MakeLower();

	//	検索
	CString	mime;
	if(m_mimeTypeMap.Lookup(ext, mime))
		return(mime);

	//	見つからない...
	return("application/octet-stream");
}


/*!
	拡張子からアイコンパスを取得
*/
CString CMimeTypeManager::GetIconPathByName(CString name)
{
	SCOPE_LOCK();

	//	MIMEタイプを取得
	CString mimeType = GetMimeTypeByName(name);

	//	拡張子取得
	CString ext;
	int index = name.ReverseFind('.');
	if(index != -1)
		ext = name.Mid(index).MakeLower();

	//	検索
	for(int i=0;i<m_iconArray.GetSize();i++)
	{
		if(ext == m_iconArray[i].m_key ||
			CTextTools::WildCompare(m_iconArray[i].m_key, mimeType) ||
			CTextTools::WildCompare(m_iconArray[i].m_key, name))
		{
			//	必要なら最適化
			if(i < MAX_OPT_INDEX)
			{
				CKeyData	temp = m_iconArray[i];
				m_iconArray.InsertAt(0, temp);
				m_iconArray.RemoveAt(i + 1);
			}

			return(m_iconArray[i].m_data);
		}
	}

	return("");
}

