/*-----------------------------------------------------------------------------
[名称]	BackUp.cpp
[概要]	バックアップクラスの実装
[備考]	なし
[履歴]	2003-04-23	NC		コメント付加(moralog)
		2004-05-10	b031228 (3204)へぼぺとの連携(moralog)
-----------------------------------------------------------------------------*/

//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#include "shitarabian.h"
#include "BackUp.h"
#include "ShitarabianDoc.h"
#include "SettingPath.h"
#include "Common.h"
#include <io.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


/*-----------------------------------------------------------------------------
[名称]	コンストラクタ
[機能]	インスタンスの生成。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CBackUp::CBackUp()
:	m_bEnable( TRUE )
,	m_uiInterval( 5 )
,	m_uiConsumeByDate( 30 )
{

}


/*-----------------------------------------------------------------------------
[名称]	デストラクタ
[機能]	インスタンスの破棄。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CBackUp::~CBackUp()
{

}


/*-----------------------------------------------------------------------------
[名称]	唯一インスタンス取得
[機能]	唯一インスタンスの取得。
[戻値]	なし
[備考]	singletonパターン。
-----------------------------------------------------------------------------*/
CBackUp*	CBackUp::GetInstance()
{
	static CBackUp	Instance;
	return( &Instance );
}


/*-----------------------------------------------------------------------------
[名称]	ドキュメントファイル出力
[機能]	バックアップファイルへの保存。
[戻値]	なし
[備考]	
		フォルダ構成
		+ したらびあんフォルダ
			+ backup
				+ yyyymmdd（日付フォルダ）
					- ファイル名hhmmss.xxx（バックアップファイル）
-----------------------------------------------------------------------------*/
void	CBackUp::DocumentSave(
	CShitarabianDoc* pDoc	// I  :ドキュメント [-] (-) :-
)
{
	if ( m_bEnable )
	{
		// パスの生成
		CString			strDatePath;
		COleDateTime	timeNow = COleDateTime::GetCurrentTime();
		{
			CString		strRootPath = CSettingPath::GetInstance()->GetShitarabianFolderPath();

			// backupフォルダ
			CString		strBackUpPath = strRootPath + "\\backup";
			::PrepareFolder( strBackUpPath );

			// 日付フォルダ
			strDatePath.Format(
				"%s\\%04d%02d%02d",
				strBackUpPath,
				timeNow.GetYear(),
				timeNow.GetMonth(),
				timeNow.GetDay()
			);
			::PrepareFolder( strDatePath );
		}

		// ファイル名の生成
		CString		strFileName;
		{
			CString		strPathName = pDoc->GetPathName();

			strFileName.Format(
				"%s_%02d%02d%02d.%s",
				::FilenameFromPathName( strPathName ),
				timeNow.GetHour(),
				timeNow.GetMinute(),
				timeNow.GetSecond(),
				::ExtFromPathName( strPathName )
			);
		}

		// 書き出し
		{
			CString		strBackupFilePath;
			strBackupFilePath.Format( "%s\\%s", strDatePath, strFileName );
			try
			{
				CFile		file( strBackupFilePath, CFile::modeCreate|CFile::modeWrite );
				CArchive	ar( &file, CArchive::store );
				pDoc->Write( ar );
			}
			catch( CFileException* e )
			{
				e->Delete();
			}
		}
	}
}


/*-----------------------------------------------------------------------------
[名称]	設定保存
[機能]	設定のファイル書き出し。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL	CBackUp::Write(
	CString&		strGeneralFilename	// I  :ファイルパス名 [-] (-) :-
)
{
	BOOL	bSuccess = TRUE;

	CString		strSection( "BackUp" );
	bSuccess &= WriteProfile( strGeneralFilename, strSection, "bEnable",			BoolToString( m_bEnable ) );
	bSuccess &= WriteProfile( strGeneralFilename, strSection, "uiConsumeByDate",	LongToString( m_uiConsumeByDate ) );
	bSuccess &= WriteProfile( strGeneralFilename, strSection, "uiInterval",			LongToString( m_uiInterval ) );

	return( bSuccess );
}


/*-----------------------------------------------------------------------------
[名称]	設定読み込み
[機能]	設定のファイル読み込み。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL	CBackUp::Read(
	CString&		strGeneralFilename	// I  :ファイルパス名 [-] (-) :-
)
{
	BOOL		bSuccess;
	{
		CString		strValue;

		CString		strSection( "BackUp" );
		bSuccess = ReadProfile( strGeneralFilename, strSection, "bEnable", &strValue );
		if ( bSuccess ){ m_bEnable	= StringToBool( strValue ); }

		bSuccess = ReadProfile( strGeneralFilename, strSection, "uiConsumeByDate", &strValue );
		if ( bSuccess ){ m_uiConsumeByDate	= StringToLong( strValue ); }

		bSuccess = ReadProfile( strGeneralFilename, strSection, "uiInterval", &strValue );
		if ( bSuccess ){ m_uiInterval	= StringToLong( strValue ); }
	}
	return( bSuccess );
}


/*-----------------------------------------------------------------------------
[名称]	バックアップフォルダ削除
[機能]	日数が経過していればバックアップファイルをフォルダごと削除する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
BOOL	CBackUp::DeleteBackup()
{
	// フォルダを列挙する
	CStringArray	astrFolderNamez;
	{
		CString		strRootPath = CSettingPath::GetInstance()->GetShitarabianFolderPath();
// ▼ (3204) BGN 2004.05.10 moralog GetShitarabianFolderPath()は末尾に\\をつけない
		CString		strBackUpPath = strRootPath + "\\backup\\";
// ▽ original BGN
//		CString		strBackUpPath = strRootPath + "backup\\";
// △ original END
// ▲ (3204) END
		struct _finddata_t c_file;
		long hFile;
		if( (hFile = _findfirst( strBackUpPath + "*", &c_file )) == -1L )
		{
			return( TRUE );
		}
		else
		{
			BOOL	bEnd = FALSE;
			while( !bEnd )
			{
				if ( c_file.attrib == _A_SUBDIR )
				{
					CString		strTmp = c_file.name;

					// ファイル名が"."か".."の場合は次を検索
					if( strTmp != _T(".") )
					if( strTmp != _T("..") )
					{
						// フォルダを発見したら記録する
						astrFolderNamez.Add( strBackUpPath + strTmp );
					}
				}

				// 次の要素を調べる
				if ( _findnext( hFile, &c_file ) != 0)
				{
					bEnd = TRUE;
				}
			}
		}
	}

	// フォルダについてのループ
	long	idxFolder;
	for( idxFolder=0 ; idxFolder<astrFolderNamez.GetSize() ; idxFolder++ )
	{
		CFileStatus	status;
		CFile::GetStatus(
			astrFolderNamez[ idxFolder ],
			status
		);

		// 日付が賞味期限を過ぎているなら
		COleDateTime		timeNow = COleDateTime::GetCurrentTime();
		COleDateTime		timeDir( status.m_mtime.GetTime() );		// please! CTimeかよ‥‥
		COleDateTimeSpan	timeConsume( m_uiConsumeByDate+1, 0, 0, 0 );
		if( timeConsume < timeNow - timeDir )
		{
			// フォルダを削除
			::DeleteDirectory( astrFolderNamez[ idxFolder ] + "\\" );
		}
	}
	return( TRUE );
}