⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 excerpt.cpp

📁 一个邮件客户端源代码,包括收发邮件,安排日程等很多内容
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	for (int i=0; i<asValues.GetSize(); i++)
	{
		if (!bCase)
			asValues[i].MakeLower();
		asValues[i].TrimLeft();
		asValues[i].TrimRight();
	}
}

BOOL CExcerpt::CheckByFilterCnd(const CFilterCnd& fc)
{
	CStringArray asValues;
	switch (fc.m_nField)
	{
		case MFF_SUBJECT:
			asValues.Add(m_strSubject);
			break;
		case MFF_FROM:
			asValues.Add(m_strFrom);
			asValues.Add(m_strFromName);	// allow Equal match for name
			break;
		case MFF_TO:
			ExtractHeaderData("To:", asValues);
			break;
		case MFF_CC:
			ExtractHeaderData("CC:", asValues);
			break;
		case MFF_HEADER:
			asValues.Copy(m_asRawHeader);
			break;
		case MFF_SIZE:
		{
			if (fc.m_nOperation != MFO_GREATER)
				return FALSE;
			int nSize = atoi(fc.m_sText);
			if (nSize<0)
				return FALSE;
			return (m_intSize > nSize);
		}
		case MFF_DATE:
		{
			if (fc.m_nOperation != MFO_GREATER)
				return FALSE;
			BOOL bDays = fc.m_sText.Find('.')<0;
			if (bDays)
			{
				int nDays = atoi(fc.m_sText);
				CTimeSpan ts = CTime::GetCurrentTime()- m_tmDate;
				if (ts.GetTotalHours()>nDays*24)
					return TRUE;
				return FALSE;
			}
			// handle full format: dd.mm.yyyy
			LPSTR pEnd;
			LPCTSTR pCur = fc.m_sText;
			int nDay = strtol(pCur, &pEnd, 10);
			if (!pEnd)
				return FALSE;
			int nMonth = strtol(pEnd+1, &pEnd, 10);
			if (!pEnd)
				return FALSE;
			int nYear = strtol(pEnd+1, &pEnd, 10);
			if (nDay<=0 || nMonth<=0 || nYear<=1900)
				return FALSE;
			CTime time(nYear, nMonth, nDay, 23, 59, 59);
			if (m_tmDate<time)
				return TRUE;
			return FALSE;
		}
	}
	CStringArray asTest;
	// if value starts with $, this can be file name
	BOOL bTestCase = (fc.m_nOperation == MFO_INC_RE);
	if (fc.m_sText.Find("$")==0)
	{
		if (!LoadTextFile(((LPCTSTR)fc.m_sText)+1, asTest, ';', bTestCase))
			asTest.Add(fc.m_sText);
	}
	else
		asTest.Add(fc.m_sText);
	PrepareValues(asTest, bTestCase);
	PrepareValues(asValues, bTestCase);

	// now scan values and try to match
	switch (fc.m_nOperation)
	{
		case MFO_INC_RE:
		{
			for (int i=0; i<asTest.GetSize(); i++)
			{
				if (asTest[i].IsEmpty())
					continue;
				CRegExp re;
				SMatches m;
				CString sTrueRE;
				if (asTest[i].GetAt(0)!='/')
					sTrueRE.Format("/%s/i", asTest[i]);	// i = ignore case
				else
					sTrueRE = asTest[i];
				if (!re.SetExpr(sTrueRE))
					continue;
				for (int j=0; j<asValues.GetSize(); j++)
				{
					if (asValues[j].IsEmpty())
						continue;
					if (re.Parse((LPTSTR)(LPCTSTR)asValues[j], &m))
					{
						TRACE("RegExp %s found in %s at %d(%d)\n", 
							sTrueRE, asValues[j], m.s[0], m.e[0]-m.s[0]);
						return TRUE;
					}
				}
			}
			return FALSE;
		}
		case MFO_EQUAL:
		{
			for (int i=0; i<asTest.GetSize(); i++)
			{
				for (int j=0; j<asValues.GetSize(); j++)
				{
					if (asValues[j].IsEmpty())
						continue;
					if (IsStringMatch(asValues[j], asTest[i]))
						return TRUE;
				}
			}
			return FALSE;
		}
		case MFO_INCLUDE:
		case MFO_NOT_INCL:
		{
			BOOL bIncl = (fc.m_nOperation == MFO_INCLUDE);
			for (int i=0; i<asTest.GetSize(); i++)
			{
				for (int j=0; j<asValues.GetSize(); j++)
				{
					if (asValues[j].Find(asTest[i])>=0)
						return bIncl;
				}
			}
			return (bIncl==0);
		}
	}
	return FALSE;
}
BOOL CExcerpt::CheckByFilter(const CMailFilter& mf)
{
	// mailbox match?
	if (mf.m_sMailBox != "*" &&
		mf.m_sMailBox != m_pMailbox->m_strAlias)
		return FALSE;
	BOOL bCnd1 = CheckByFilterCnd(mf.m_aCnd[0]);
	if (mf.m_nCombination == MFC_OR)
	{
		if (bCnd1)
			return TRUE;
		return CheckByFilterCnd(mf.m_aCnd[1]);
	}
	if (mf.m_nCombination == MFC_AND)
	{
		if (!bCnd1)
			return FALSE;
		return CheckByFilterCnd(mf.m_aCnd[1]);
	}
	// MFC_NONE is implied
	return bCnd1;
}

void CExcerpt::BeginDataDownload()
{
	if (m_bitPreviewData)
	{
		m_nPreviewLines = 0;
		m_nPreviewSize = 0;
	}
	m_nLoadedSize = 0;
	TCHAR szTempPath[MAX_PATH];
	GetTempPath( sizeof( szTempPath ), szTempPath );
	
	// check for free space on tmp drive
	{
		TCHAR szRootPathName[] = { szTempPath[0], szTempPath[1], szTempPath[2], _T('\x0') };
		DWORD dwSectorsPerCluster = 0;		// sectors per cluster 
		DWORD dwBytesPerSector = 0;			// bytes per sector 
		DWORD dwNumberOfFreeClusters = 0;	// number of free clusters  
		DWORD dwTotalNumberOfClusters = 0; 	// total number of clusters  

		BOOL bRes = GetDiskFreeSpace
		(
			szRootPathName,	
			&dwSectorsPerCluster,
			&dwBytesPerSector,
			&dwNumberOfFreeClusters,
			&dwTotalNumberOfClusters
		);

		ULONG ulongFreeBytes = ULONG( dwNumberOfFreeClusters ) 
			* ULONG( dwSectorsPerCluster )
			* ULONG( dwBytesPerSector );

		if( !bRes || ulongFreeBytes < ULONG( m_intSize ) )
		{
			CString strMessage;
			AfxFormatString1( strMessage, IDP_INSUFFICIENT_TMP_FREE_SPACE_1, CString( szRootPathName ) );
			AfxMessageBox( strMessage, MB_ICONSTOP );
			EndDataDownload();
			return;
		}
	}

	CString strTitle = m_strID;
	int i;
	while( -1 != ( i = strTitle.FindOneOf( _T("/\\:*?\"<>|") ) ) ) strTitle.SetAt( i, _T(' ') );
	strTitle.TrimLeft();
	strTitle.TrimRight();

	m_strDataFileName.Format( _T("%s%s@%s.%s"), szTempPath, strTitle, m_pMailbox->m_strHost, theApp.strFileExtensionForMessages );

	if( INVALID_HANDLE_VALUE != m_hDataFile )
	{
		CloseHandle( m_hDataFile );
		m_hDataFile = INVALID_HANDLE_VALUE;
	}

	m_hDataFile = CreateFile
	(
		m_strDataFileName,
		GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ,
		NULL,
		CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,
		NULL
	);
	
	if( INVALID_HANDLE_VALUE == m_hDataFile )
	{
		TRACE2( "File Error #%d; [%s] cannot create\n", GetLastError(), m_strDataFileName );
		EndDataDownload();
	}
}

BOOL CExcerpt::WriteBufferToDataFile( const char *buf, unsigned size )
{
	if (m_bitPreviewData)
	{
		m_nPreviewLines++;
		if (m_nPreviewLines>m_asRawHeader.GetSize())
			m_nPreviewSize += size;
	}
	m_nLoadedSize += size;
	Change( COLUMN_SIZE );
	ASSERT( size > 0 );
	if( INVALID_HANDLE_VALUE == m_hDataFile ) return FALSE;

	DWORD dwTmp = 0;
	if( FALSE == WriteFile( m_hDataFile, buf, size, &dwTmp, NULL ) )
	{
		ASSERT( false );
		CloseHandle( m_hDataFile );
		m_hDataFile = INVALID_HANDLE_VALUE;
	};

	ASSERT( dwTmp == size );
	if (m_bitPreviewData && m_nPreviewSize>(theApp.intPreviewSize*1024))
	{
		m_bitPreviewData = 0;
		m_bitPreviewLoaded = 1;
		return FALSE;
	}

	return TRUE;
}

void CExcerpt::EndDataDownload()
{
	m_bitDownloadData = 0;

	if ( INVALID_HANDLE_VALUE != m_hDataFile ) 
	{
		if (m_bitPreviewData)	// but not m_bitPreviewLoaded -> short message
		{
			m_bitPreviewLoaded = 0;
			m_bitPreviewData = 0;
		}
		if (!m_bitPreviewLoaded)
			m_bitDownloaded = 1;
	}
	else 
	{
		m_bitPreviewData = 0;
		m_bitDownloaded = 0; 
		m_bitPreviewLoaded = 0;
		return; 
	}
	m_bitPreviewData = 0;

	Change( COLUMN_MBOX );
	Change( COLUMN_SUBJ );

	CloseHandle( m_hDataFile );
	m_hDataFile = INVALID_HANDLE_VALUE;

	if( m_bitQuickView )
	{
		QuickView();
	}
	if( m_bitViewText )
	{
		QuickText();
	}
/*	
	if( m_bitRedirect )
	{

	}
*/
}

void CExcerpt::QuickPreviewText()
{
	BOOL bLoaded = FALSE;
	
	if ((GetFileAttributes(m_strDataFileName) & FILE_ATTRIBUTE_DIRECTORY)==0)
	{
		if (m_bitDownloaded || m_bitPreviewLoaded)
			bLoaded = TRUE;
		else if (m_nLoadedSize>=theApp.intPreviewSize*1024)	// maybe some data was loaded?
			bLoaded = TRUE;
	}
	if (bLoaded)
	{
		// get txt handler, if any
		CString sTxtApp;
		GetTextHandler(sTxtApp, m_strDataFileName);

		WinExec(sTxtApp, SW_SHOW);

		m_bitViewText = 0;
		m_bitQuickView = 0;
		m_bitPreviewData = 0;
		if (theApp.intMarkRead == READ_VIEW || 
			theApp.intMarkRead == READ_BOTH)
			MarkAsRead(TRUE);
		return;
	}

	m_bitPreviewData = 1;
	m_bitViewText = 1;
	m_bitDownloaded = 0;
	m_bitPreviewLoaded = 0;
	Change( COLUMN_MBOX );
	Change( COLUMN_SUBJ );

	m_pMailbox->Check();
}

void CExcerpt::QuickPreview()
{
	if ( (m_bitDownloaded || m_bitPreviewLoaded) && 
		(GetFileAttributes(m_strDataFileName) & FILE_ATTRIBUTE_DIRECTORY)==0
		)
	{
		return;
	}

	m_bitPreviewData = 1;
	m_bitQuickView = 1;
	m_bitDownloaded = 0;
	m_bitPreviewLoaded = 0;
	Change( COLUMN_SUBJ );

	m_pMailbox->Check();
}

void CExcerpt::QuickLoad()
{
	if ( m_bitDownloaded && 
		(GetFileAttributes(m_strDataFileName) & FILE_ATTRIBUTE_DIRECTORY)==0
		)
		return;	// already done

	m_bitDownloadData = 1;
	m_bitDownloaded = 0;
	m_bitPreviewData = 0;
	m_bitPreviewLoaded = 0;
	Change( COLUMN_SUBJ );

	m_pMailbox->Check();
}

void CExcerpt::QuickView()
{
	DWORD dwExitCode;
	if( !GetExitCodeProcess( m_hViewer, &dwExitCode ) || 
		STILL_ACTIVE != dwExitCode )
	{
		m_hViewer = 0;
	}

	if( m_hViewer )
	{
		
		
		// make process foreground
	}
	else if ( m_bitDownloaded && 
		(GetFileAttributes(m_strDataFileName) & FILE_ATTRIBUTE_DIRECTORY)==0
		)
	{
		SHELLEXECUTEINFO sei = 
		{
			sizeof( SHELLEXECUTEINFO ),
			SEE_MASK_DOENVSUBST | SEE_MASK_NOCLOSEPROCESS,
			NULL,
			_T("open"),
			m_strDataFileName,
			NULL,
			NULL,
			SW_NORMAL,
			0, 0, 0, 0, 0, 0, 0
		};		
		
		ShellExecuteEx( &sei );
		m_hViewer = sei.hProcess;

		m_bitQuickView = 0;
		if (theApp.intMarkRead == READ_VIEW || 
			theApp.intMarkRead == READ_BOTH)
			MarkAsRead(TRUE);
	}
	else
	{
		m_bitDownloadData = m_bitQuickView = 1;
		m_bitDownloaded = 0;
		m_bitPreviewData = 0;
		m_bitPreviewLoaded = 0;
		Change( COLUMN_MBOX );

		m_pMailbox->Check();
	}
}

void CExcerpt::QuickText()
{
	if ( ( m_bitDownloaded || m_bitPreviewLoaded) &&
		(GetFileAttributes(m_strDataFileName) & FILE_ATTRIBUTE_DIRECTORY)==0
		)
	{
		CString sTxtApp;
		GetTextHandler(sTxtApp, m_strDataFileName);

		WinExec(sTxtApp, SW_SHOW);

		m_bitViewText = 0;
		m_bitQuickView = 0;
		if (theApp.intMarkRead == READ_VIEW || 
			theApp.intMarkRead == READ_BOTH)
			MarkAsRead(TRUE);
	}
	else
	{
		m_bitDownloadData = 1;
		m_bitQuickView = 0;
		m_bitViewText = 1;
		m_bitDownloaded = 0;
		m_bitPreviewData = 0;
		m_bitPreviewLoaded = 0;
		Change( COLUMN_MBOX );

		m_pMailbox->Check();
	}
}

void CExcerpt::MarkAsRead(BOOL bRead)
{
	m_bitWasRead = bRead;
	Change( COLUMN_MBOX );
	m_pMailbox->Change( COLUMN_MAIL );	// need redraw
}

void CExcerpt::MarkAsSpam(BOOL bSpam)
{
	if (bSpam)
		m_dwFiltered |= MFA_SPAM_MAN;
	else
		m_dwFiltered &= ~MFA_SPAM_MAN;
	Change( COLUMN_MBOX );
	Change( COLUMN_SUBJ );
	m_pMailbox->Change( COLUMN_MAIL );	// need redraw

}
BOOL CExcerpt::WasRead()
{
	return (m_bitWasRead==1 || (m_dwFiltered & MFA_SPAM_MAN) == MFA_SPAM_MAN);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -