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

📄 searchresultswnd.cpp

📁 另外一款开放源码的高质量p2p源码软件
💻 CPP
📖 第 1 页 / 共 4 页
字号:
void WriteOldMaxMetaDataSearchParam(CString& rstrDbg, CSafeMemFile& data, 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(rstrDbg, data, uMetaTagID, uOperator, uValue, bEd2k);
}

bool GetSearchPacket(CSafeMemFile* pData, SSearchParams* pParams, bool bOptUTF8)
{
	CSafeMemFile& data = *pData;

	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;
	}

	_strCurKadKeyword.Empty();
	ASSERT( !pParams->strExpression.IsEmpty() );
	if (pParams->eType == SearchTypeKademlia)
	{
		ASSERT( !pParams->strKeyword.IsEmpty() );
		_strCurKadKeyword = pParams->strKeyword;
	}
	if (pParams->strBooleanExpr.IsEmpty())
		pParams->strBooleanExpr = pParams->strExpression;
	if (pParams->strBooleanExpr.IsEmpty())
		return false;

	_astrParserErrors.RemoveAll();
	_SearchExpr.m_aExpr.RemoveAll();
	if (!pParams->strBooleanExpr.IsEmpty())
	{
	    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);
	    }
	}

	// 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);
	CString strDbg;
	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)
				WriteBooleanAND(strDbg, data);
			WriteMetaDataSearchParam(strDbg, data, _SearchExpr.m_aExpr[0], bOptUTF8);
		}

		if (!strFileType.IsEmpty()){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
			WriteMetaDataSearchParamA(strDbg, data, FT_FILETYPE, strFileType);
		}
		
		if (pParams->ulMinSize > 0){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
			WriteOldMinMetaDataSearchParam(strDbg, data, FT_FILESIZE, pParams->ulMinSize, bEd2k);
		}

		if (pParams->ulMaxSize > 0){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
			WriteOldMaxMetaDataSearchParam(strDbg, data, FT_FILESIZE, pParams->ulMaxSize, bEd2k);
		}
		
		if (pParams->uAvailability > 0){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
			WriteOldMinMetaDataSearchParam(strDbg, data, FT_SOURCES, pParams->uAvailability, bEd2k);
		}

		if (!pParams->strExtension.IsEmpty()){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
			WriteMetaDataSearchParam(strDbg, data, FT_FILEFORMAT, pParams->strExtension, bOptUTF8);
		}

		if (pParams->uComplete > 0){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
			WriteOldMinMetaDataSearchParam(strDbg, data, FT_COMPLETE_SOURCES, pParams->uComplete, bEd2k);
		}

		if (pParams->ulMinBitrate > 0){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
			WriteOldMinMetaDataSearchParam(strDbg, data, bEd2k ? FT_ED2K_MEDIA_BITRATE : TAG_MEDIA_BITRATE, pParams->ulMinBitrate, bEd2k);
		}

		if (pParams->ulMinLength > 0){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
			WriteOldMinMetaDataSearchParam(strDbg, data, bEd2k ? FT_ED2K_MEDIA_LENGTH : TAG_MEDIA_LENGTH, pParams->ulMinLength, bEd2k);
		}

		if (!pParams->strCodec.IsEmpty()){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
			WriteMetaDataSearchParam(strDbg, data, bEd2k ? FT_ED2K_MEDIA_CODEC : TAG_MEDIA_CODEC, pParams->strCodec, bOptUTF8);
		}

		if (!pParams->strTitle.IsEmpty()){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
			WriteMetaDataSearchParam(strDbg, data, bEd2k ? FT_ED2K_MEDIA_TITLE : TAG_MEDIA_TITLE, pParams->strTitle, bOptUTF8);
		}

		if (!pParams->strAlbum.IsEmpty()){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
			WriteMetaDataSearchParam(strDbg, data, bEd2k ? FT_ED2K_MEDIA_ALBUM : TAG_MEDIA_ALBUM, pParams->strAlbum, bOptUTF8);
		}

		if (!pParams->strArtist.IsEmpty()){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
			WriteMetaDataSearchParam(strDbg, data, bEd2k ? FT_ED2K_MEDIA_ARTIST : TAG_MEDIA_ARTIST, pParams->strArtist, bOptUTF8);
		}

		ASSERT( iParameterCount == iTotalTerms );
	}
	else
	{
		if (!pParams->strExtension.IsEmpty()){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
		}

		if (pParams->uAvailability > 0){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
		}
	  
		if (pParams->ulMaxSize > 0){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
		}
        
		if (pParams->ulMinSize > 0){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
		}
        
		if (!strFileType.IsEmpty()){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
		}
        
		if (pParams->uComplete > 0){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
		}

		if (pParams->ulMinBitrate > 0){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
		}

		if (pParams->ulMinLength > 0){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
		}

		if (!pParams->strCodec.IsEmpty()){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
		}

		if (!pParams->strTitle.IsEmpty()){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
		}

		if (!pParams->strAlbum.IsEmpty()){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
		}

		if (!pParams->strArtist.IsEmpty()){
			if (++iParameterCount < iTotalTerms)
				WriteBooleanAND(strDbg, data);
		}

		ASSERT( iParameterCount + _SearchExpr.m_aExpr.GetCount() == iTotalTerms );

		for (int j = 0; j < _SearchExpr.m_aExpr.GetCount(); j++)
		{
			CString str(_SearchExpr.m_aExpr[j]);
			if (str == SEARCHOPTOK_AND)
				WriteBooleanAND(strDbg, data);
			else if (str == SEARCHOPTOK_OR)
				WriteBooleanOR(strDbg, data);
			else if (str == SEARCHOPTOK_NOT)
				WriteBooleanNOT(strDbg, data);
			else
				WriteMetaDataSearchParam(strDbg, data, str, bOptUTF8);
		}

		if (!strFileType.IsEmpty())
			WriteMetaDataSearchParamA(strDbg, data, FT_FILETYPE, strFileType);

		if (pParams->ulMinSize > 0)
			WriteOldMinMetaDataSearchParam(strDbg, data, FT_FILESIZE, pParams->ulMinSize, bEd2k);

		if (pParams->ulMaxSize > 0)
			WriteOldMaxMetaDataSearchParam(strDbg, data, FT_FILESIZE, pParams->ulMaxSize, bEd2k);

		if (pParams->uAvailability > 0)
			WriteOldMinMetaDataSearchParam(strDbg, data, FT_SOURCES, pParams->uAvailability, bEd2k);

		if (!pParams->strExtension.IsEmpty())
			WriteMetaDataSearchParam(strDbg, data, FT_FILEFORMAT, pParams->strExtension, bOptUTF8);

		if (pParams->uComplete > 0)
			WriteOldMinMetaDataSearchParam(strDbg, data, FT_COMPLETE_SOURCES, pParams->uComplete, bEd2k);

		if (pParams->ulMinBitrate > 0)
			WriteOldMinMetaDataSearchParam(strDbg, data, bEd2k ? FT_ED2K_MEDIA_BITRATE : TAG_MEDIA_BITRATE, pParams->ulMinBitrate, bEd2k);

		if (pParams->ulMinLength > 0)
			WriteOldMinMetaDataSearchParam(strDbg, data, bEd2k ? FT_ED2K_MEDIA_LENGTH : TAG_MEDIA_LENGTH, pParams->ulMinLength, bEd2k);

		if (!pParams->strCodec.IsEmpty())
			WriteMetaDataSearchParam(strDbg, data, bEd2k ? FT_ED2K_MEDIA_CODEC : TAG_MEDIA_CODEC, pParams->strCodec, bOptUTF8);

		if (!pParams->strTitle.IsEmpty())
			WriteMetaDataSearchParam(strDbg, data, bEd2k ? FT_ED2K_MEDIA_TITLE : TAG_MEDIA_TITLE, pParams->strTitle, bOptUTF8);

		if (!pParams->strAlbum.IsEmpty())
			WriteMetaDataSearchParam(strDbg, data, bEd2k ? FT_ED2K_MEDIA_ALBUM : TAG_MEDIA_ALBUM, pParams->strAlbum, bOptUTF8);

		if (!pParams->strArtist.IsEmpty())
			WriteMetaDataSearchParam(strDbg, data, bEd2k ? FT_ED2K_MEDIA_ARTIST : TAG_MEDIA_ARTIST, pParams->strArtist, bOptUTF8);
	}

	if (thePrefs.GetDebugServerSearchesLevel() > 0)
		Debug(_T("Search Data: %s\n"), strDbg);
	_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;
		}

		return true;
	}

	ASSERT(0);
	delete pParams;
	return false;
}

bool CSearchResultsWnd::DoNewEd2kSearch(SSearchParams* pParams)
{
	if (!theApp.serverconnect->IsConnected())
		return false;

	CSafeMemFile data(100);
	if (!GetSearchPacket(&data, pParams, false) || data.GetLength() == 0)
		return false;

⌨️ 快捷键说明

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