int CServerListCtrl::SortProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { const CServer* item1 = (CServer*)lParam1; const CServer* item2 = (CServer*)lParam2; if (item1 == NULL || item2 == NULL) return 0; #define UNDEFINED_STR_AT_BOTTOM(s1, s2) \ if ((s1).IsEmpty() && (s2).IsEmpty()) \ return 0; \ if ((s1).IsEmpty()) \ return 1; \ if ((s2).IsEmpty()) \ return -1; \ #define UNDEFINED_INT_AT_BOTTOM(i1, i2) \ if ((i1) == (i2)) \ return 0; \ if ((i1) == 0) \ return 1; \ if ((i2) == 0) \ return -1; \ int iResult; switch (LOWORD(lParamSort)){ case 0: UNDEFINED_STR_AT_BOTTOM(item1->GetListName(), item2->GetListName()); iResult = item1->GetListName().CompareNoCase(item2->GetListName()); break; case 1: if (item1->HasDynIP() && item2->HasDynIP()) iResult = item1->GetDynIP().CompareNoCase(item2->GetDynIP()); else if (item1->HasDynIP()) iResult = -1; else if (item2->HasDynIP()) iResult = 1; else{ uint32 uIP1 = htonl(item1->GetIP()); uint32 uIP2 = htonl(item2->GetIP()); if (uIP1 < uIP2) iResult = -1; else if (uIP1 > uIP2) iResult = 1; else iResult = CompareUnsigned(item1->GetPort(), item2->GetPort()); } break; case 2: UNDEFINED_STR_AT_BOTTOM(item1->GetDescription(), item2->GetDescription()); iResult = item1->GetDescription().CompareNoCase(item2->GetDescription()); break; case 3: UNDEFINED_INT_AT_BOTTOM(item1->GetPing(), item2->GetPing()); iResult = CompareUnsigned(item1->GetPing(), item2->GetPing()); break; case 4: UNDEFINED_INT_AT_BOTTOM(item1->GetUsers(), item2->GetUsers()); iResult = CompareUnsigned(item1->GetUsers(), item2->GetUsers()); break; case 5: UNDEFINED_INT_AT_BOTTOM(item1->GetMaxUsers(), item2->GetMaxUsers()); iResult = CompareUnsigned(item1->GetMaxUsers(), item2->GetMaxUsers()); break; case 6: UNDEFINED_INT_AT_BOTTOM(item1->GetFiles(), item2->GetFiles()); iResult = CompareUnsigned(item1->GetFiles(), item2->GetFiles()); break; case 7: if (item2->GetPreferences() == item1->GetPreferences()) iResult = 0; else if (item2->GetPreferences() == SRV_PR_LOW) iResult = 1; else if (item1->GetPreferences() == SRV_PR_LOW) iResult = -1; else if (item2->GetPreferences() == SRV_PR_HIGH) iResult = -1; else if (item1->GetPreferences() == SRV_PR_HIGH) iResult = 1; else iResult = 0; break; case 8: iResult = CompareUnsigned(item1->GetFailedCount(), item2->GetFailedCount()); break; //==> simplify Serverwindow [shadow2004] #if defined(SRVWND1) case 9: iResult = (int)item1->IsStaticMember() - (int)item2->IsStaticMember(); break; case 10: UNDEFINED_INT_AT_BOTTOM(item1->GetSoftFiles(), item2->GetSoftFiles()); iResult = CompareUnsigned(item1->GetSoftFiles(), item2->GetSoftFiles()); break; case 11: UNDEFINED_INT_AT_BOTTOM(item1->GetHardFiles(), item2->GetHardFiles()); iResult = CompareUnsigned(item1->GetHardFiles(), item2->GetHardFiles()); break; case 12: UNDEFINED_STR_AT_BOTTOM(item1->GetVersion(), item2->GetVersion()); iResult = item1->GetVersion().CompareNoCase(item2->GetVersion()); break; case 13: UNDEFINED_INT_AT_BOTTOM(item1->GetLowIDUsers(), item2->GetLowIDUsers()); iResult = CompareUnsigned(item1->GetLowIDUsers(), item2->GetLowIDUsers()); break; #else //SRVWND1 case 9: UNDEFINED_INT_AT_BOTTOM(item1->GetLowIDUsers(), item2->GetLowIDUsers()); iResult = CompareUnsigned(item1->GetLowIDUsers(), item2->GetLowIDUsers()); break; #endif //SRVWND1 //<== simplify Serverwindow [shadow2004] default: iResult = 0; } if (HIWORD(lParamSort)) iResult = -iResult; return iResult; }
int CServerListCtrl::SortProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { const CServer* item1 = (CServer*)lParam1; const CServer* item2 = (CServer*)lParam2; if (item1 == NULL || item2 == NULL) return 0; #define UNDEFINED_STR_AT_BOTTOM(s1, s2) \ if ((s1).IsEmpty() && (s2).IsEmpty()) \ return 0; \ if ((s1).IsEmpty()) \ return 1; \ if ((s2).IsEmpty()) \ return -1; \ #define UNDEFINED_INT_AT_BOTTOM(i1, i2) \ if ((i1) == (i2)) \ return 0; \ if ((i1) == 0) \ return 1; \ if ((i2) == 0) \ return -1; \ int iResult; switch (LOWORD(lParamSort)){ case 0: UNDEFINED_STR_AT_BOTTOM(item1->GetListName(), item2->GetListName()); iResult = item1->GetListName().CompareNoCase(item2->GetListName()); break; case 1: if (item1->HasDynIP() && item2->HasDynIP()) iResult = item1->GetDynIP().CompareNoCase(item2->GetDynIP()); else if (item1->HasDynIP()) iResult = -1; else if (item2->HasDynIP()) iResult = 1; else{ uint32 uIP1 = htonl(item1->GetIP()); uint32 uIP2 = htonl(item2->GetIP()); if (uIP1 < uIP2) iResult = -1; else if (uIP1 > uIP2) iResult = 1; else iResult = CompareUnsigned(item1->GetPort(), item2->GetPort()); } break; case 2: UNDEFINED_STR_AT_BOTTOM(item1->GetDescription(), item2->GetDescription()); iResult = item1->GetDescription().CompareNoCase(item2->GetDescription()); break; case 3: UNDEFINED_INT_AT_BOTTOM(item1->GetPing(), item2->GetPing()); iResult = CompareUnsigned(item1->GetPing(), item2->GetPing()); break; case 4: UNDEFINED_INT_AT_BOTTOM(item1->GetUsers(), item2->GetUsers()); iResult = CompareUnsigned(item1->GetUsers(), item2->GetUsers()); break; case 5: UNDEFINED_INT_AT_BOTTOM(item1->GetMaxUsers(), item2->GetMaxUsers()); iResult = CompareUnsigned(item1->GetMaxUsers(), item2->GetMaxUsers()); break; case 6: UNDEFINED_INT_AT_BOTTOM(item1->GetFiles(), item2->GetFiles()); iResult = CompareUnsigned(item1->GetFiles(), item2->GetFiles()); break; case 7: if (item2->GetPreference() == item1->GetPreference()) iResult = 0; else if (item2->GetPreference() == SRV_PR_LOW) iResult = 1; else if (item1->GetPreference() == SRV_PR_LOW) iResult = -1; else if (item2->GetPreference() == SRV_PR_HIGH) iResult = -1; else if (item1->GetPreference() == SRV_PR_HIGH) iResult = 1; else iResult = 0; break; case 8: iResult = CompareUnsigned(item1->GetFailedCount(), item2->GetFailedCount()); break; case 9: iResult = (int)item1->IsStaticMember() - (int)item2->IsStaticMember(); break; case 10: UNDEFINED_INT_AT_BOTTOM(item1->GetSoftFiles(), item2->GetSoftFiles()); iResult = CompareUnsigned(item1->GetSoftFiles(), item2->GetSoftFiles()); break; case 11: UNDEFINED_INT_AT_BOTTOM(item1->GetHardFiles(), item2->GetHardFiles()); iResult = CompareUnsigned(item1->GetHardFiles(), item2->GetHardFiles()); break; case 12: UNDEFINED_STR_AT_BOTTOM(item1->GetVersion(), item2->GetVersion()); iResult = item1->GetVersion().CompareNoCase(item2->GetVersion()); break; case 13: UNDEFINED_INT_AT_BOTTOM(item1->GetLowIDUsers(), item2->GetLowIDUsers()); iResult = CompareUnsigned(item1->GetLowIDUsers(), item2->GetLowIDUsers()); break; case 14: iResult = (int)(item1->SupportsObfuscationTCP() && item1->GetObfuscationPortTCP() != 0) - (int)(item2->SupportsObfuscationTCP() && item2->GetObfuscationPortTCP() != 0); 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->serverwnd->serverlistctrl.GetNextSortOrder(lParamSort)) != (-1)){ iResult= SortProc(lParam1, lParam2, dwNextSort); } if (HIWORD(lParamSort)) iResult = -iResult; return iResult; }