📄 excerpt.cpp
字号:
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 + -