| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 | 
							- #include "stdafx.h"
 
- #include ".\dittocopybuffer.h"
 
- #include "CP_Main.h"
 
- #include <Mmsystem.h> //play sound
 
- CDittoCopyBuffer::CDittoCopyBuffer() :
 
- 	m_ActiveTimer(TRUE, TRUE),
 
- 	m_RestoreTimer(TRUE, TRUE),
 
- 	m_Pasting(TRUE, TRUE)
 
- {
 
- 	m_bActive = false;
 
- 	m_dwLastPaste = 0;
 
- }
 
- CDittoCopyBuffer::~CDittoCopyBuffer(void)
 
- {
 
- }
 
- bool CDittoCopyBuffer::StartCopy(long lCopyBuffer, bool bCut)
 
- {
 
- 	Log(StrF(_T("Start of Ditto Copy buffer = %d"), lCopyBuffer));
 
- 	//Tell the timer thread to exit
 
- 	m_ActiveTimer.SetEvent();
 
- 	//Make sure the end copy thread has exited
 
- 	EndRestoreThread();
 
- 	if(m_SavedClipboard.Save(FALSE))
 
- 	{
 
- 		if(bCut)
 
- 		{
 
- 			theApp.m_activeWnd.SendCut();
 
- 		}
 
- 		else
 
- 		{
 
- 			theApp.m_activeWnd.SendCopy(CopyReasonEnum::COPY_TO_BUFFER);
 
- 		}
 
- 		//Create a thread to track if they have copied anything, if thread has exited before they have
 
- 		//copied something then the copy buffer copy is canceled
 
- 		AfxBeginThread(CDittoCopyBuffer::StartCopyTimer, (LPVOID)this, THREAD_PRIORITY_LOWEST);
 
- 		m_bActive = true;
 
- 		m_lCurrentDittoBuffer = lCopyBuffer;
 
- 	}
 
- 	else
 
- 	{
 
- 		Log(_T("Start of Ditto Failed to save buffer"));
 
- 	}
 
- 	return true;
 
- }
 
- UINT CDittoCopyBuffer::StartCopyTimer(LPVOID pParam)
 
- {
 
- 	CDittoCopyBuffer *pBuffer = (CDittoCopyBuffer*)pParam;
 
- 	if(pBuffer)
 
- 	{
 
- 		pBuffer->m_ActiveTimer.ResetEvent();
 
- 		DWORD dRes = WaitForSingleObject(pBuffer->m_ActiveTimer, 1500);
 
- 		if(dRes == WAIT_TIMEOUT)
 
- 		{
 
- 			pBuffer->m_SavedClipboard.Clear();
 
- 			pBuffer->m_bActive = false;
 
- 		}
 
- 	}
 
- 	return 0;
 
- }
 
- bool CDittoCopyBuffer::EndCopy(long lID)
 
- {
 
- 	if(m_lCurrentDittoBuffer < 0 || m_lCurrentDittoBuffer >= 10)
 
- 	{
 
- 		Log(_T("tried to save copy buffer but copy buffer is empty"));
 
- 		return false;
 
- 	}
 
- 	if(m_bActive == false)
 
- 	{
 
- 		Log(_T("Current buffer is not active can't save copy buffer to db"));
 
- 		return false;
 
- 	}
 
- 	m_ActiveTimer.SetEvent();
 
- 	m_bActive = false;
 
- 	Log(StrF(_T("Start - Ditto EndCopy buffer = %d"), m_lCurrentDittoBuffer));
 
- 	bool bRet = false;
 
- 	//put the data that we stored at the start of this action back on the standard clipboard
 
- 	m_SavedClipboard.Restore();
 
- 	
 
- 	if(PutClipOnDittoCopyBuffer(lID, m_lCurrentDittoBuffer))
 
- 	{
 
- 		Log(StrF(_T("Ditto end copy, saved clip successfully Clip ID = %d"), lID));	
 
- 		bRet = true;
 
- 	}
 
- 	else
 
- 	{
 
- 		Log(StrF(_T("Ditto end copy, ERROR associating clip to Copy buffer ID = %d"), lID));
 
- 	}
 
- 	return bRet;
 
- }
 
- bool CDittoCopyBuffer::PutClipOnDittoCopyBuffer(long lClipId, long lBuffer)
 
- {
 
- 	try
 
- 	{
 
- 		//enclose in brackets so the query closes before we update below
 
- 		{
 
- 			CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID FROM CopyBuffers WHERE lCopyBuffer = %d"), lBuffer);
 
- 			if(q.eof())
 
- 			{
 
- 				theApp.m_db.execDMLEx(_T("INSERT INTO CopyBuffers VALUES(NULL, -1, %d);"), lBuffer);
 
- 			}
 
- 		}
 
- 		theApp.m_db.execDMLEx(_T("UPDATE CopyBuffers SET lClipID = %d WHERE lCopyBuffer = %d"), lClipId, lBuffer);
 
- 		CCopyBufferItem Item;
 
- 		g_Opt.GetCopyBufferItem(lBuffer, Item);
 
- 		if(Item.m_bPlaySoundOnCopy)
 
- 		{
 
- 			PlaySound(_T("ding.wav"), NULL, SND_FILENAME|SND_ASYNC);
 
- 		}
 
- 		return true;
 
- 	}
 
- 	CATCH_SQLITE_EXCEPTION
 
- 	return false;
 
- }
 
- bool CDittoCopyBuffer::PastCopyBuffer(long lCopyBuffer)
 
- {
 
- 	//Can't paste while another is still active
 
- 	if(WaitForSingleObject(m_Pasting, 1) == WAIT_TIMEOUT)
 
- 	{
 
- 		Log(_T("Copy Buffer pasted to fast"));
 
- 		return false;
 
- 	}
 
- 	m_RestoreTimer.ResetEvent();
 
- 	m_Pasting.ResetEvent();
 
- 	bool bRet = false;
 
- 	Log(StrF(_T("Start - PastCopyBuffer buffer = %d"), m_lCurrentDittoBuffer));
 
- 	try
 
- 	{
 
- 		CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT Main.lID FROM Main ")
 
- 													_T("INNER JOIN CopyBuffers ON CopyBuffers.lClipID = Main.lID ")
 
- 													_T("WHERE CopyBuffers.lCopyBuffer = %d"), lCopyBuffer);
 
- 		if(q.eof() == false)
 
- 		{
 
- 			m_pClipboard = new CClipboardSaveRestoreCopyBuffer;
 
- 			if(m_pClipboard)
 
- 			{
 
- 				//Save the clipboard, 
 
- 				//then put the new data on the clipboard
 
- 				//then send a paste
 
- 				//then wait a little and restore the original clipboard data
 
- 				if(m_pClipboard->Save(false))
 
- 				{
 
- 					theApp.m_pMainFrame->PasteOrShowGroup(q.getIntField(_T("lID")), -1, FALSE, TRUE, false);
 
- 					m_pClipboard->m_lRestoreDelay = g_Opt.GetDittoRestoreClipboardDelay();
 
- 					Log(StrF(_T("PastCopyBuffer sent paste, starting thread to restore clipboard, Delay = %d"), m_pClipboard->m_lRestoreDelay));
 
- 					AfxBeginThread(CDittoCopyBuffer::DelayRestoreClipboard, (LPVOID)this, THREAD_PRIORITY_LOWEST);
 
- 					bRet = true;
 
- 				}
 
- 				else
 
- 				{
 
- 					Log(_T("PastCopyBuffer failed to save clipboard"));
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- 	CATCH_SQLITE_EXCEPTION
 
- 	if(bRet == false)
 
- 		m_Pasting.SetEvent();
 
- 	return bRet;
 
- }
 
- void CDittoCopyBuffer::EndRestoreThread()
 
- {
 
- 	//Tell the thread to stop waiting and restore the clipboard
 
- 	m_RestoreTimer.SetEvent();
 
- 	//make sure it's ended
 
- 	WaitForSingleObject(m_Pasting, 5000);
 
- }
 
- UINT CDittoCopyBuffer::DelayRestoreClipboard(LPVOID pParam)
 
- {
 
- 	CDittoCopyBuffer *pBuffer = (CDittoCopyBuffer*)pParam;
 
- 	if(pBuffer)
 
- 	{
 
- 		CClipboardSaveRestoreCopyBuffer *pLocalClipboard = pBuffer->m_pClipboard;
 
- 		DWORD dRes = WaitForSingleObject(pBuffer->m_RestoreTimer, pLocalClipboard->m_lRestoreDelay);
 
- 		if(GetKeyState(VK_SHIFT) & 0x8000)
 
- 		{
 
- 			Log(_T("Shift key is down not restoring clipbard, custom Buffer on normal clipboard"));
 
- 		}
 
- 		else
 
- 		{
 
- 			if(pLocalClipboard->Restore())
 
- 			{
 
- 				Log(_T("CDittoCopyBuffer::DelayRestoreClipboard Successfully"));
 
- 			}
 
- 			else
 
- 			{
 
- 				Log(_T("CDittoCopyBuffer::DelayRestoreClipboard Failed to restore"));
 
- 			}
 
- 		}
 
- 		delete pLocalClipboard;
 
- 		pLocalClipboard = NULL;
 
- 		pBuffer->m_Pasting.SetEvent();
 
- 	}
 
- 	return TRUE;
 
- }
 
 
  |