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

📄 searchresultswnd.cpp

📁 电驴的源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	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 + -