Beispiel #1
0
int CUploadListCtrl::SortProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    const CUpDownClient *item1 = (CUpDownClient *)lParam1;
    const CUpDownClient *item2 = (CUpDownClient *)lParam2;
    int iColumn = (lParamSort >= 100) ? lParamSort - 100 : lParamSort;
    int iResult = 0;
    switch (iColumn)
    {
    case 0:
        if (item1->GetUserName() && item2->GetUserName())
            iResult = CompareLocaleStringNoCase(item1->GetUserName(), item2->GetUserName());
        else if (item1->GetUserName() == NULL)
            iResult = 1; // place clients with no usernames at bottom
        else if (item2->GetUserName() == NULL)
            iResult = -1; // place clients with no usernames at bottom
        break;

    case 1: {
        // ==> requpfile optimization [SiRoB] - Stulle
        /*
        const CKnownFile *file1 = theApp.sharedfiles->GetFileByID(item1->GetUploadFileID());
        const CKnownFile *file2 = theApp.sharedfiles->GetFileByID(item2->GetUploadFileID());
        */
        const CKnownFile *file1 = item1->CheckAndGetReqUpFile();
        const CKnownFile *file2 = item2->CheckAndGetReqUpFile();
        // <== requpfile optimization [SiRoB] - Stulle
        if (file1 != NULL && file2 != NULL)
            iResult = CompareLocaleStringNoCase(file1->GetFileName(), file2->GetFileName());
        else if (file1 == NULL)
            iResult = 1;
        else
            iResult = -1;
        break;
    }

    // Maella -Accurate measure of bandwidth: eDonkey data + control, network adapter-
    /*
    case 2:
    	iResult = CompareUnsigned(item1->GetDatarate(), item2->GetDatarate());
    	break;
    */
    case 2:
        iResult = item1->GetUploadDatarate() - item2->GetUploadDatarate();
        break;
    // Maella end

    case 3:
        iResult = CompareUnsigned(item1->GetSessionUp(), item2->GetSessionUp());
        //Xman don't show too many values
        /*
        if (iResult == 0 && thePrefs.m_bExtControls)
        	iResult = CompareUnsigned(item1->GetQueueSessionPayloadUp(), item2->GetQueueSessionPayloadUp());
        */
        //Xman end
        break;

    case 4:
        iResult = CompareUnsigned(item1->GetWaitTime(), item2->GetWaitTime());
        break;

    case 5:
        iResult = CompareUnsigned(item1->GetUpStartTimeDelay() ,item2->GetUpStartTimeDelay());
        break;

    case 6:
        iResult = item1->GetUploadState() - item2->GetUploadState();
        break;

    case 7:
        // ==> Sort progress bars by percentage [Fafner/Xman] - Stulle
        /*
        iResult = CompareUnsigned(item1->GetUpPartCount(), item2->GetUpPartCount());
        */
        if (item1->GetHisCompletedPartsPercent_UP() == item2->GetHisCompletedPartsPercent_UP())
            iResult=0;
        else
            iResult=item1->GetHisCompletedPartsPercent_UP() > item2->GetHisCompletedPartsPercent_UP()?1:-1;
        // <== Sort progress bars by percentage [Fafner/Xman] - Stulle
        break;

    //Xman version see clientversion in every window
    case 8:
        // Maella -Support for tag ET_MOD_VERSION 0x55-
        if(item1->GetClientSoft() == item2->GetClientSoft())
            if(item1->GetVersion() == item2->GetVersion() && (item1->GetClientSoft() == SO_EMULE || item1->GetClientSoft() == SO_AMULE)) {
                iResult = item2->DbgGetFullClientSoftVer().CompareNoCase( item1->DbgGetFullClientSoftVer());
            }
            else {
                iResult = item1->GetVersion() - item2->GetVersion();
            }
        else
            iResult = -(item1->GetClientSoft() - item2->GetClientSoft()); // invert result to place eMule's at top
        break;
    //Xman end

    //Xman show complete up/down in uploadlist
    case 9:
        if(item1->Credits() && item2->Credits())
        {
            iResult=CompareUnsigned64(item1->credits->GetUploadedTotal(), item2->credits->GetUploadedTotal());
        }
        else
            iResult=0;
        break;
    //Xman end

    // ==> Uploading Chunk Detail Display [SiRoB/Fafner] - Stulle
    case 10:
        if (item1->GetUpChunkProgressPercent() == item2->GetUpChunkProgressPercent())
            iResult=0;
        else
            iResult=item1->GetUpChunkProgressPercent() > item2->GetUpChunkProgressPercent()?1:-1;
        break;
        // <== Uploading Chunk Detail Display [SiRoB/Fafner] - Stulle
    }

    if (lParamSort >= 100)
        iResult = -iResult;

    // SLUGFILLER: multiSort remove - handled in parent class
    /*
    //call secondary sortorder, if this one results in equal
    int dwNextSort;
    if (iResult == 0 && (dwNextSort = theApp.emuledlg->transferwnd->m_pwndTransfer->uploadlistctrl.GetNextSortOrder(lParamSort)) != -1)
    	iResult = SortProc(lParam1, lParam2, dwNextSort);
    */
    // SLUGFILLER End
    return iResult;
}
int CQueueListCtrl::SortProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	const CUpDownClient *item1 = (CUpDownClient *)lParam1;
	const CUpDownClient *item2 = (CUpDownClient *)lParam2;
	int iColumn = (lParamSort >= 100) ? lParamSort - 100 : lParamSort;
	int iResult = 0;
	switch (iColumn)
	{
		case 0:
			if (item1->GetUserName() && item2->GetUserName())
				iResult = CompareLocaleStringNoCase(item1->GetUserName(), item2->GetUserName());
			else if (item1->GetUserName() == NULL)
				iResult = 1; // place clients with no usernames at bottom
			else if (item2->GetUserName() == NULL)
				iResult = -1; // place clients with no usernames at bottom
			break;

		case 1: {
			const CKnownFile *file1 = theApp.sharedfiles->GetFileByID(item1->GetUploadFileID());
			const CKnownFile *file2 = theApp.sharedfiles->GetFileByID(item2->GetUploadFileID());
			if (file1 != NULL && file2 != NULL)
				iResult = CompareLocaleStringNoCase(file1->GetFileName(), file2->GetFileName());
			else if (file1 == NULL)
				iResult = 1;
			else
				iResult = -1;
			break;
		}

		case 2: {
			const CKnownFile *file1 = theApp.sharedfiles->GetFileByID(item1->GetUploadFileID());
			const CKnownFile *file2 = theApp.sharedfiles->GetFileByID(item2->GetUploadFileID());
			if (file1 != NULL && file2 != NULL)
			// ==> PowerShare [ZZ/MorphXT] - Stulle
			// ==> Fair Play [AndCycle/Stulle] - Stulle
			{
				if (!file1->GetPowerShared() && !file1->statistic.GetFairPlay() && (file2->GetPowerShared() || file2->statistic.GetFairPlay()))
					iResult=-1;			
				else if ((file1->GetPowerShared() || file1->statistic.GetFairPlay()) && !file2->GetPowerShared() && !file2->statistic.GetFairPlay())
					iResult=1;
				else
			// <== Fair Play [AndCycle/Stulle] - Stulle
			// <== PowerShare [ZZ/MorphXT] - Stulle
				iResult = (file1->GetUpPriority() == PR_VERYLOW ? -1 : file1->GetUpPriority()) - (file2->GetUpPriority() == PR_VERYLOW ? -1 : file2->GetUpPriority());
			} // PowerShare [ZZ/MorphXT] - Stulle
			else if (file1 == NULL)
				iResult = 1;
			else
				iResult = -1;
			break;
		}

		case 3:
			iResult = CompareUnsigned(item1->GetScore(false, false, true), item2->GetScore(false, false, true));
			break;

		case 4:
			// ==> Superior Client Handling [Stulle] - Stulle
			if(!item1->IsSuperiorClient() && item2->IsSuperiorClient())
					iResult=-1;
			else if(item1->IsSuperiorClient() && !item2->IsSuperiorClient())
					iResult=1;
			else
			// <== Superior Client Handling [Stulle] - Stulle
			iResult = CompareUnsigned(item1->GetScore(false), item2->GetScore(false));
			break;

		case 5:
			iResult = CompareUnsigned(item1->GetAskedCount(), item2->GetAskedCount());
			break;

		case 6:
			iResult = CompareUnsigned(item1->GetLastUpRequest(), item2->GetLastUpRequest());
			break;

		case 7:
			// ==> SUQWT [Moonlight/EastShare/ MorphXT] - Stulle
			/*
			iResult = CompareUnsigned(item1->GetWaitStartTime(), item2->GetWaitStartTime());
			*/
			{
				sint64 time1 = item1->GetWaitStartTime();
				sint64 time2 = item2->GetWaitStartTime();
				if ( time1 == time2 ) {
					iResult = 0;
				} else if ( time1 > time2 ) {
					iResult = 1;
				} else {
					iResult = -1;
				}
				break;
			}
			// <== SUQWT [Moonlight/EastShare/ MorphXT] - Stulle
			break;

		case 8:
			iResult = item1->IsBanned() - item2->IsBanned();
			break;
		
		case 9: 
			// ==> Sort progress bars by percentage [Fafner/Xman] - Stulle
			/*
			iResult = CompareUnsigned(item1->GetUpPartCount(), item2->GetUpPartCount());
			*/
			if (item1->GetHisCompletedPartsPercent_UP() == item2->GetHisCompletedPartsPercent_UP())
				iResult=0;
			else
				iResult=item1->GetHisCompletedPartsPercent_UP() > item2->GetHisCompletedPartsPercent_UP()?1:-1;
			// <== Sort progress bars by percentage [Fafner/Xman] - Stulle
			break;
		//Xman version see clientversion in every window
		case 10:
			// Maella -Support for tag ET_MOD_VERSION 0x55-
			if(item1->GetClientSoft() == item2->GetClientSoft())
				if(item1->GetVersion() == item2->GetVersion() && (item1->GetClientSoft() == SO_EMULE || item1->GetClientSoft() == SO_AMULE)){
					iResult = item2->DbgGetFullClientSoftVer().CompareNoCase( item1->DbgGetFullClientSoftVer());
				}
				else {
					iResult = item1->GetVersion() - item2->GetVersion();
				}
			else
				iResult = -(item1->GetClientSoft() - item2->GetClientSoft()); // invert result to place eMule's at top
			break;
		//Xman show complete up/down in queuelist
		case 11:
			if(item1->Credits() && item2->Credits())
				iResult=CompareUnsigned64(item1->credits->GetUploadedTotal(), item2->credits->GetUploadedTotal());
			else
				iResult=0;
			break;
		//Xman end

		// ==> push small files [sivka] - Stulle
		case 12:
			iResult=item1->GetSmallFilePush() - item2->GetSmallFilePush();
			break;
		// <== push small files [sivka] - Stulle

		// ==> push rare file - Stulle
		case 13:
			iResult=CompareFloat(item1->GetRareFilePushRatio(),item2->GetRareFilePushRatio());
			break;
		// <== push rare file - Stulle
	}

	if (lParamSort >= 100)
		iResult = -iResult;

	// SLUGFILLER: multiSort remove - handled in parent class
	/*
	//call secondary sortorder, if this one results in equal
	int dwNextSort;
	if (iResult == 0 && (dwNextSort = theApp.emuledlg->transferwnd->GetQueueList()->GetNextSortOrder(lParamSort)) != -1)
		iResult = SortProc(lParam1, lParam2, dwNextSort);
	*/
	// SLUGFILLER: multiSort remove - handled in parent class

	return iResult;
}
int CClientListCtrl::SortProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	const CUpDownClient* item1 = (CUpDownClient*)lParam1;
	const CUpDownClient* item2 = (CUpDownClient*)lParam2;
	
	int iResult=0;
	switch (lParamSort) {
	    case 0:
			if (item1->GetUserName() && item2->GetUserName())
				iResult=CompareLocaleStringNoCase(item1->GetUserName(), item2->GetUserName());
			else if (!item1->GetUserName() && !item2->GetUserName())
				iResult=0;
			else {
				// place clients with no usernames at bottom
				if (!item1->GetUserName())
					iResult=1;
				else
					iResult=-1;
			}
			break;
	    case 100:
			if (item1->GetUserName() && item2->GetUserName())
				iResult=CompareLocaleStringNoCase(item2->GetUserName(), item1->GetUserName());
			else if (!item1->GetUserName() && !item2->GetUserName())
				iResult=0;
			else {
				// place clients with no usernames at bottom
				if (!item1->GetUserName())
					iResult=1;
				else
					iResult=-1;
			}
			break;

		case 1:
		    iResult=item1->GetUploadState() - item2->GetUploadState();
			break;
	    case 101:
		    iResult=item2->GetUploadState() - item1->GetUploadState();
			break;

		case 2:
			if (item1->credits && item2->credits)
				iResult=CompareUnsigned64(item1->credits->GetUploadedTotal(), item2->credits->GetUploadedTotal());
			else if (!item1->credits)
			    iResult=1;
			else
				iResult=-1;
			break;
	    case 102:
			if (item1->credits && item2->credits)
				iResult=CompareUnsigned64(item2->credits->GetUploadedTotal(), item1->credits->GetUploadedTotal());
			else if (!item1->credits)
				iResult=1;
			else
			    iResult=-1;
			break;

		case 3:
		    if (item1->GetDownloadState() == item2->GetDownloadState()) {
			    if (item1->IsRemoteQueueFull() && item2->IsRemoteQueueFull())
				    iResult=0;
			    else if (item1->IsRemoteQueueFull())
				    iResult=1;
			    else if (item2->IsRemoteQueueFull())
				    iResult=-1;
			    else
				    iResult=0;
		    } else
				iResult=item1->GetDownloadState() - item2->GetDownloadState();
			break;
	    case 103:
		    if (item2->GetDownloadState() == item1->GetDownloadState()) {
			    if (item2->IsRemoteQueueFull() && item1->IsRemoteQueueFull())
				    iResult=0;
			    else if (item2->IsRemoteQueueFull())
				    iResult=1;
			    else if (item1->IsRemoteQueueFull())
				    iResult=-1;
			    else
				    iResult=0;
		    } else
				iResult=item2->GetDownloadState() - item1->GetDownloadState();
			break;

		case 4:
		    if (item1->credits && item2->credits)
				iResult=CompareUnsigned64(item1->credits->GetDownloadedTotal(), item2->credits->GetDownloadedTotal());
		    else if (!item1->credits)
			    iResult=1;
		    else
				iResult=-1;
			break;
	    case 104:
		    if (item1->credits && item2->credits)
				iResult=CompareUnsigned64(item2->credits->GetDownloadedTotal(), item1->credits->GetDownloadedTotal());
		    else if (!item1->credits)
			    iResult=1;
		    else
			    iResult=-1;
			break;

		case 5:
		    if (item1->GetClientSoft() == item2->GetClientSoft())
			    iResult=item2->GetVersion() - item1->GetVersion();
		    else 
				iResult=item1->GetClientSoft() - item2->GetClientSoft();
			break;
	    case 105:
		    if (item1->GetClientSoft() == item2->GetClientSoft())
			    iResult=item1->GetVersion() - item2->GetVersion();
		    else
				iResult=item2->GetClientSoft() - item1->GetClientSoft();
			break;

		case 6:
		    if (item1->socket && item2->socket)
			    iResult=item1->socket->IsConnected() - item2->socket->IsConnected();
		    else if (!item1->socket)
			    iResult=-1;
		    else
			    iResult=1;
			break;
	    case 106:
		    if (item1->socket && item2->socket)
			    iResult=item2->socket->IsConnected() - item1->socket->IsConnected();
		    else if (!item2->socket)
			    iResult=-1;
		    else
			    iResult=1;
			break;

		case 7:
		    iResult=memcmp(item1->GetUserHash(), item2->GetUserHash(), 16);
			break;
	    case 107:
		    iResult=memcmp(item2->GetUserHash(), item1->GetUserHash(), 16);
			break;

		default:
			iResult=0;
	}

	int dwNextSort;
	//call secondary sortorder, if this one results in equal
	//(Note: yes I know this call is evil OO wise, but better than changing a lot more code, while we have only one instance anyway - might be fixed later)
	if (iResult == 0 && (dwNextSort = theApp.emuledlg->transferwnd->clientlistctrl.GetNextSortOrder(lParamSort)) != (-1)){
		iResult= SortProc(lParam1, lParam2, dwNextSort);
	}

	return iResult;
}