// eraser.cpp
#include "stdafx.h"
#include "apl_api.h"
#include "Eraser.h"

#include <psapi.h>
#pragma comment (lib,"psapi.lib")


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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//CArray <SFileInfo,SFileInfo&> CEraser::m_info_array;
CaplTAggr <SFileInfo*,SFileInfo*,APLAGGR_LIST|APLAGGR_AUTOKILLREF> CEraser::m_info_array;
long CEraser::timer;


CEraser::CEraser()
{
//	OutputDebugString(_T("CEraser::CEraser() !!!!!!!!!!!!!!!!!!!!!!!!!\n"));
}

CEraser::~CEraser()
{
//	OutputDebugString(_T("CEraser::~CEraser() 1 !!!!!!!!!!!!!!!!!!!!!!!\n"));
	OnTimer(0,0,0,0);
//	OutputDebugString(_T("CEraser::~CEraser() 2 !!!!!!!!!!!!!!!!!!!!!!!\n"));
}

void CALLBACK CEraser::OnTimer(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
	KillTimer(0,timer);
	timer=0;
	
	int i;
	DWORD dwExitCode;
	for (i = 0; i < m_info_array.GetSize(); i++)
	{
		if(m_info_array[i]->m_hProcess!=0)
		{
			if (GetExitCodeProcess(m_info_array[i]->m_hProcess, &dwExitCode))
			{
				if (dwExitCode == STILL_ACTIVE) continue;
			}
		}
		
		// ayatsk - в чем смысл проверки не понял - убрал
		// if(m_info_array[i]->auto_chekout==false)
		m_info_array[i]->m_hProcess=0;
		::SetFileAttributes(m_info_array[i]->m_sPath, FILE_ATTRIBUTE_NORMAL);
		::DeleteFile(m_info_array[i]->m_sPath);

		CFileFind ff; 
		if(!ff.FindFile(m_info_array[i]->m_sPath))
		{
			m_info_array.Remove(i);
			i--;
		}
	}

	if(m_info_array.GetSize()>0)
	{
		timer=SetTimer(NULL, 0, 5000, CEraser::OnTimer);
	}
}
void CEraser::AddFileInfo(CString file,HANDLE process, bool auto_out)
{
	int i;
	for (i = 0; i < m_info_array.GetSize(); i++)
	{
		if (m_info_array[i]->m_sPath==file)
		{
			m_info_array[i]->m_hProcess=process;
			m_info_array[i]->auto_chekout=auto_out;
			return;
		}
	}

	// ЯАИ 12.04.2024 notepad++ при запуске передает данные своему корневому процессу и умирает
	// и, чтобы файлы сразу не удалались, просто не будем их удалять вообще
	TCHAR *pImageFileName=new TCHAR[MAX_PATH];
	GetProcessImageFileName(process,pImageFileName,MAX_PATH);
	CString sPath(pImageFileName);
	delete pImageFileName; pImageFileName=0;
	sPath.MakeLower();
	if(sPath.Find(_T("notepad++"))>=0) return;

	if(timer!=0){KillTimer(0,timer); timer=0;} // Иначе есть шанс что  файл удалиться до того, как приложение откроется.

	SFileInfo* info=new SFileInfo();
	info->auto_chekout=auto_out;
	info->m_hProcess=process;
	info->m_sPath=file;
	m_info_array.Add(info);
	if(timer==0) timer=SetTimer(NULL, 0, 30000, CEraser::OnTimer);
}
