📄 searchresultswnd.cpp
字号:
void WriteOldMaxMetaDataSearchParam(LPCSTR pszMetaTagID, UINT uValue, bool bEd2k)
{
UINT uOperator;
if (bEd2k){
uOperator = ED2K_SEARCH_OP_LESS;
uValue += 1;
}
else
uOperator = KAD_SEARCH_OP_LESS_EQUAL;
WriteMetaDataSearchParam(pszMetaTagID, uOperator, uValue, bEd2k);
}
void WriteOldMaxMetaDataSearchParam(UINT uMetaTagID, UINT uValue, bool bEd2k)
{
UINT uOperator;
if (bEd2k){
uOperator = ED2K_SEARCH_OP_LESS;
uValue += 1;
}
else
uOperator = KAD_SEARCH_OP_LESS_EQUAL;
WriteMetaDataSearchParam(uMetaTagID, uOperator, uValue, bEd2k);
}
protected:
CSafeMemFile* m_data;
CString m_strDbg;
EUtf8Str m_eStrEncode;
};
bool GetSearchPacket(CSafeMemFile* pData, SSearchParams* pParams)
{
CStringA strFileType;
if (pParams->strFileType == ED2KFTSTR_ARCHIVE){
// eDonkeyHybrid 0.48 uses type "Pro" for archives files
// www.filedonkey.com uses type "Pro" for archives files
strFileType = ED2KFTSTR_PROGRAM;
}
else if (pParams->strFileType == ED2KFTSTR_CDIMAGE){
// eDonkeyHybrid 0.48 uses *no* type for iso/nrg/cue/img files
// www.filedonkey.com uses type "Pro" for CD-image files
strFileType = ED2KFTSTR_PROGRAM;
}
else{
//TODO: Support "Doc" types
strFileType = pParams->strFileType;
}
_strCurKadKeywordA.Empty();
ASSERT( !pParams->strExpression.IsEmpty() );
if (pParams->eType == SearchTypeKademlia)
{
ASSERT( !pParams->strKeyword.IsEmpty() );
_strCurKadKeywordA = StrToUtf8(pParams->strKeyword);
}
if (pParams->strBooleanExpr.IsEmpty())
pParams->strBooleanExpr = pParams->strExpression;
if (pParams->strBooleanExpr.IsEmpty())
return false;
//TRACE(_T("Raw search expr:\n"));
//TRACE(_T("%s"), pParams->strBooleanExpr);
//TRACE(_T(" %s\n"), DbgGetHexDump((uchar*)(LPCTSTR)pParams->strBooleanExpr, pParams->strBooleanExpr.GetLength()*sizeof(TCHAR)));
_astrParserErrors.RemoveAll();
_SearchExpr.m_aExpr.RemoveAll();
if (!pParams->strBooleanExpr.IsEmpty())
{
// check this here again, we could have been called from Webinterface or MM
if (!pParams->bUnicode)
{
CStringA strACP(pParams->strBooleanExpr);
if (!IsValidEd2kStringA(strACP))
throw new CMsgBoxException(GetResString(IDS_SEARCH_EXPRERROR) + _T("\n\n") + GetResString(IDS_SEARCH_INVALIDCHAR), MB_ICONWARNING | MB_HELP, eMule_FAQ_Search - HID_BASE_PROMPT);
}
LexInit(pParams->strBooleanExpr);
int iParseResult = yyparse();
LexFree();
if (_astrParserErrors.GetSize() > 0)
{
_SearchExpr.m_aExpr.RemoveAll();
throw new CMsgBoxException(GetResString(IDS_SEARCH_EXPRERROR) + _T("\n\n") + _astrParserErrors[_astrParserErrors.GetSize() - 1], MB_ICONWARNING | MB_HELP, eMule_FAQ_Search - HID_BASE_PROMPT);
}
else if (iParseResult != 0)
{
_SearchExpr.m_aExpr.RemoveAll();
throw new CMsgBoxException(GetResString(IDS_SEARCH_EXPRERROR) + _T("\n\n") + GetResString(IDS_SEARCH_GENERALERROR), MB_ICONWARNING | MB_HELP, eMule_FAQ_Search - HID_BASE_PROMPT);
}
}
//TRACE(_T("Parsed search expr:\n"));
//for (int i = 0; i < _SearchExpr.m_aExpr.GetCount(); i++){
// TRACE(_T("%s"), _SearchExpr.m_aExpr[i]);
// TRACE(_T(" %s\n"), DbgGetHexDump((uchar*)(LPCTSTR)_SearchExpr.m_aExpr[i], _SearchExpr.m_aExpr[i].GetLength()*sizeof(TCHAR)));
//}
// get total nr. of search terms
int iTotalTerms = 0;
if (!pParams->strExtension.IsEmpty())
iTotalTerms++;
if (pParams->uAvailability > 0)
iTotalTerms++;
if (pParams->ulMaxSize > 0)
iTotalTerms++;
if (pParams->ulMinSize > 0)
iTotalTerms++;
if (!strFileType.IsEmpty())
iTotalTerms++;
if (pParams->uComplete > 0)
iTotalTerms++;
if (pParams->ulMinBitrate > 0)
iTotalTerms++;
if (pParams->ulMinLength > 0)
iTotalTerms++;
if (!pParams->strCodec.IsEmpty())
iTotalTerms++;
if (!pParams->strTitle.IsEmpty())
iTotalTerms++;
if (!pParams->strAlbum.IsEmpty())
iTotalTerms++;
if (!pParams->strArtist.IsEmpty())
iTotalTerms++;
iTotalTerms += _SearchExpr.m_aExpr.GetCount();
// create ed2k search expression
bool bEd2k = (pParams->eType == SearchTypeEd2kServer || pParams->eType == SearchTypeEd2kGlobal);
CSearchExprTarget target(pData, pParams->bUnicode ? utf8strRaw : utf8strNone);
int iParameterCount = 0;
if (_SearchExpr.m_aExpr.GetCount() <= 1)
{
// If we don't have a NOT or OR operator we use a series of AND terms which can be processed by
// the servers with less load (request lugdunummaster)
//
// input: "a" AND min=1 AND max=2
// instead of: AND AND "a" min=1 max=2
// we use: AND "a" AND min=1 max=2
if (_SearchExpr.m_aExpr.GetCount() > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteMetaDataSearchParam(OptUtf8ToStr(_SearchExpr.m_aExpr[0]));
}
if (!strFileType.IsEmpty()){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteMetaDataSearchParamA(FT_FILETYPE, strFileType);
}
if (pParams->ulMinSize > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteOldMinMetaDataSearchParam(FT_FILESIZE, pParams->ulMinSize, bEd2k);
}
if (pParams->ulMaxSize > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteOldMaxMetaDataSearchParam(FT_FILESIZE, pParams->ulMaxSize, bEd2k);
}
if (pParams->uAvailability > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteOldMinMetaDataSearchParam(FT_SOURCES, pParams->uAvailability, bEd2k);
}
if (!pParams->strExtension.IsEmpty()){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteMetaDataSearchParam(FT_FILEFORMAT, pParams->strExtension);
}
if (pParams->uComplete > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteOldMinMetaDataSearchParam(FT_COMPLETE_SOURCES, pParams->uComplete, bEd2k);
}
if (pParams->ulMinBitrate > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteOldMinMetaDataSearchParam(bEd2k ? FT_ED2K_MEDIA_BITRATE : TAG_MEDIA_BITRATE, pParams->ulMinBitrate, bEd2k);
}
if (pParams->ulMinLength > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteOldMinMetaDataSearchParam(bEd2k ? FT_ED2K_MEDIA_LENGTH : TAG_MEDIA_LENGTH, pParams->ulMinLength, bEd2k);
}
if (!pParams->strCodec.IsEmpty()){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteMetaDataSearchParam(bEd2k ? FT_ED2K_MEDIA_CODEC : TAG_MEDIA_CODEC, pParams->strCodec);
}
if (!pParams->strTitle.IsEmpty()){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteMetaDataSearchParam(bEd2k ? FT_ED2K_MEDIA_TITLE : TAG_MEDIA_TITLE, pParams->strTitle);
}
if (!pParams->strAlbum.IsEmpty()){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteMetaDataSearchParam(bEd2k ? FT_ED2K_MEDIA_ALBUM : TAG_MEDIA_ALBUM, pParams->strAlbum);
}
if (!pParams->strArtist.IsEmpty()){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
target.WriteMetaDataSearchParam(bEd2k ? FT_ED2K_MEDIA_ARTIST : TAG_MEDIA_ARTIST, pParams->strArtist);
}
ASSERT( iParameterCount == iTotalTerms );
}
else
{
if (!pParams->strExtension.IsEmpty()){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
}
if (pParams->uAvailability > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
}
if (pParams->ulMaxSize > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
}
if (pParams->ulMinSize > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
}
if (!strFileType.IsEmpty()){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
}
if (pParams->uComplete > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
}
if (pParams->ulMinBitrate > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
}
if (pParams->ulMinLength > 0){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
}
if (!pParams->strCodec.IsEmpty()){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
}
if (!pParams->strTitle.IsEmpty()){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
}
if (!pParams->strAlbum.IsEmpty()){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
}
if (!pParams->strArtist.IsEmpty()){
if (++iParameterCount < iTotalTerms)
target.WriteBooleanAND();
}
ASSERT( iParameterCount + _SearchExpr.m_aExpr.GetCount() == iTotalTerms );
for (int j = 0; j < _SearchExpr.m_aExpr.GetCount(); j++)
{
CStringA strA(_SearchExpr.m_aExpr[j]);
if (strA == SEARCHOPTOK_AND)
target.WriteBooleanAND();
else if (strA == SEARCHOPTOK_OR)
target.WriteBooleanOR();
else if (strA == SEARCHOPTOK_NOT)
target.WriteBooleanNOT();
else
target.WriteMetaDataSearchParam(OptUtf8ToStr(strA));
}
if (!strFileType.IsEmpty())
target.WriteMetaDataSearchParamA(FT_FILETYPE, strFileType);
if (pParams->ulMinSize > 0)
target.WriteOldMinMetaDataSearchParam(FT_FILESIZE, pParams->ulMinSize, bEd2k);
if (pParams->ulMaxSize > 0)
target.WriteOldMaxMetaDataSearchParam(FT_FILESIZE, pParams->ulMaxSize, bEd2k);
if (pParams->uAvailability > 0)
target.WriteOldMinMetaDataSearchParam(FT_SOURCES, pParams->uAvailability, bEd2k);
if (!pParams->strExtension.IsEmpty())
target.WriteMetaDataSearchParam(FT_FILEFORMAT, pParams->strExtension);
if (pParams->uComplete > 0)
target.WriteOldMinMetaDataSearchParam(FT_COMPLETE_SOURCES, pParams->uComplete, bEd2k);
if (pParams->ulMinBitrate > 0)
target.WriteOldMinMetaDataSearchParam(bEd2k ? FT_ED2K_MEDIA_BITRATE : TAG_MEDIA_BITRATE, pParams->ulMinBitrate, bEd2k);
if (pParams->ulMinLength > 0)
target.WriteOldMinMetaDataSearchParam(bEd2k ? FT_ED2K_MEDIA_LENGTH : TAG_MEDIA_LENGTH, pParams->ulMinLength, bEd2k);
if (!pParams->strCodec.IsEmpty())
target.WriteMetaDataSearchParam(bEd2k ? FT_ED2K_MEDIA_CODEC : TAG_MEDIA_CODEC, pParams->strCodec);
if (!pParams->strTitle.IsEmpty())
target.WriteMetaDataSearchParam(bEd2k ? FT_ED2K_MEDIA_TITLE : TAG_MEDIA_TITLE, pParams->strTitle);
if (!pParams->strAlbum.IsEmpty())
target.WriteMetaDataSearchParam(bEd2k ? FT_ED2K_MEDIA_ALBUM : TAG_MEDIA_ALBUM, pParams->strAlbum);
if (!pParams->strArtist.IsEmpty())
target.WriteMetaDataSearchParam(bEd2k ? FT_ED2K_MEDIA_ARTIST : TAG_MEDIA_ARTIST, pParams->strArtist);
}
if (thePrefs.GetDebugServerSearchesLevel() > 0)
Debug(_T("Search Data: %s\n"), target.GetDebugString());
_SearchExpr.m_aExpr.RemoveAll();
return true;
}
bool CSearchResultsWnd::StartNewSearch(SSearchParams* pParams)
{
ESearchType eSearchType = pParams->eType;
if (eSearchType == SearchTypeEd2kServer || eSearchType == SearchTypeEd2kGlobal)
{
if (!theApp.serverconnect->IsConnected())
{
AfxMessageBox(GetResString(IDS_ERR_NOTCONNECTED), MB_ICONWARNING);
delete pParams;
return false;
}
try
{
if (!DoNewEd2kSearch(pParams))
{
delete pParams;
return false;
}
}
catch (CMsgBoxException* ex)
{
AfxMessageBox(ex->m_strMsg, ex->m_uType, ex->m_uHelpID);
ex->Delete();
delete pParams;
return false;
}
CWnd* pWndFocus = GetFocus();
m_pwndParams->m_ctlStart.EnableWindow(FALSE);
if (pWndFocus && pWndFocus->m_hWnd == m_pwndParams->m_ctlStart.m_hWnd)
m_pwndParams->m_ctlName.SetFocus();
m_pwndParams->m_ctlCancel.EnableWindow(TRUE);
return true;
}
if (eSearchType == SearchTypeKademlia)
{
if (!Kademlia::CKademlia::isRunning() || !Kademlia::CKademlia::isConnected())
{
AfxMessageBox(GetResString(IDS_ERR_NOTCONNECTEDKAD), MB_ICONWARNING);
delete pParams;
return false;
}
try
{
if (!DoNewKadSearch(pParams))
{
delete pParams;
return false;
}
}
catch (CMsgBoxException* ex)
{
AfxMessageBox(ex->m_strMsg, ex->m_uType, ex->m_uHelpID);
ex->Delete();
delete pParams;
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -