bool CServerList::LoadServerMet(const CPath& path) { AddLogLineN(CFormat(_("Loading server.met file: %s")) % path); bool merge = !m_servers.empty(); if (!path.FileExists()) { AddLogLineN(_("Server.met file not found!")); return false; } // Try to unpack the file, might be an archive const wxChar* mets[] = { wxT("server.met"), NULL }; // Try to unpack the file, might be an archive if (UnpackArchive(path, mets).second != EFT_Met) { AddLogLineC(CFormat(_("Failed to load server.met file '%s', unknown format encountered.")) % path); return false; } CFile servermet(path, CFile::read); if ( !servermet.IsOpened() ){ AddLogLineN(_("Failed to open server.met!") ); return false; } try { Notify_ServerFreeze(); byte version = servermet.ReadUInt8(); if (version != 0xE0 && version != MET_HEADER) { AddLogLineC(CFormat(_("Server.met file corrupt, found invalid versiontag: 0x%x, size %i")) % version % sizeof(version)); Notify_ServerThaw(); return false; } uint32 fservercount = servermet.ReadUInt32(); ServerMet_Struct sbuffer; uint32 iAddCount = 0; for ( uint32 j = 0; j < fservercount; ++j ) { sbuffer.ip = servermet.ReadUInt32(); sbuffer.port = servermet.ReadUInt16(); sbuffer.tagcount = servermet.ReadUInt32(); CServer* newserver = new CServer(&sbuffer); // Load tags for ( uint32 i = 0; i < sbuffer.tagcount; ++i ) { newserver->AddTagFromFile(&servermet); } // Server priorities are not in sorted order // High = 1, Low = 2, Normal = 0, so we have to check // in a less logical fashion. int priority = newserver->GetPreferences(); if (priority < SRV_PR_MIN || priority > SRV_PR_MAX) { newserver->SetPreference(SRV_PR_NORMAL); } // set listname for server if ( newserver->GetListName().IsEmpty() ) { newserver->SetListName(wxT("Server ") +newserver->GetAddress()); } if ( !theApp->AddServer(newserver) ) { CServer* update = GetServerByAddress(newserver->GetAddress(), newserver->GetPort()); if(update) { update->SetListName( newserver->GetListName()); if(!newserver->GetDescription().IsEmpty()) { update->SetDescription( newserver->GetDescription()); } Notify_ServerRefresh(update); } delete newserver; } else { ++iAddCount; } } Notify_ServerThaw(); if (!merge) { AddLogLineC(CFormat(wxPLURAL("%i server in server.met found", "%i servers in server.met found", fservercount)) % fservercount); } else { AddLogLineC(CFormat(wxPLURAL("%d server added", "%d servers added", iAddCount)) % iAddCount); } } catch (const CInvalidPacket& err) { AddLogLineC(_("Error: the file 'server.met' is corrupted: ") + err.what()); Notify_ServerThaw(); return false; } catch (const CSafeIOException& err) { AddLogLineC(_("IO error while reading 'server.met': ") + err.what()); Notify_ServerThaw(); return false; } return true; }
bool CServerList::AddServerMetToList(const CString& strFile, bool bMerge) { if (!bMerge) { theApp.emuledlg->serverwnd->serverlistctrl.DeleteAllItems(); RemoveAllServers(); } CSafeBufferedFile servermet; CFileException fexp; if (!servermet.Open(strFile ,CFile::modeRead|CFile::osSequentialScan|CFile::typeBinary|CFile::shareDenyWrite, &fexp)){ if (!bMerge){ CString strError(GetResString(IDS_ERR_LOADSERVERMET)); TCHAR szError[MAX_CFEXP_ERRORMSG]; if (fexp.GetErrorMessage(szError,ARRSIZE(szError))){ strError += _T(" - "); strError += szError; } LogError(LOG_STATUSBAR, _T("%s"), strError); } return false; } setvbuf(servermet.m_pStream, NULL, _IOFBF, 16384); try{ version = servermet.ReadUInt8(); if (version != 0xE0 && version != MET_HEADER){ servermet.Close(); LogError(LOG_STATUSBAR,GetResString(IDS_ERR_BADSERVERMETVERSION), version); return false; } theApp.emuledlg->serverwnd->serverlistctrl.Hide(); theApp.emuledlg->serverwnd->serverlistctrl.SetRedraw(FALSE); UINT fservercount = servermet.ReadUInt32(); ServerMet_Struct sbuffer; UINT iAddCount = 0; for (UINT j = 0; j < fservercount; j++) { // get server servermet.Read(&sbuffer, sizeof(ServerMet_Struct)); CServer* newserver = new CServer(&sbuffer); // add tags for (UINT i = 0; i < sbuffer.tagcount; i++) newserver->AddTagFromFile(&servermet); if (bMerge) { // If we are merging a (downloaded) server list into our list, ignore the priority of the // server -- some server list providers are doing a poor job with this and offering lists // with dead servers set to 'High'.. newserver->SetPreference(SRV_PR_NORMAL); } // set listname for server if (newserver->GetListName().IsEmpty()) newserver->SetListName(newserver->GetAddress()); if (!theApp.emuledlg->serverwnd->serverlistctrl.AddServer(newserver, true, true)) { CServer* update = theApp.serverlist->GetServerByAddress(newserver->GetAddress(), newserver->GetPort()); if (update) { update->SetListName(newserver->GetListName()); update->SetDescription(newserver->GetDescription()); theApp.emuledlg->serverwnd->serverlistctrl.RefreshServer(update); } delete newserver; } else iAddCount++; } if (!bMerge) AddLogLine(true,GetResString(IDS_SERVERSFOUND), fservercount); else AddLogLine(true,GetResString(IDS_SERVERSADDED), iAddCount, fservercount - iAddCount); servermet.Close(); } catch(CFileException* error){ if (error->m_cause == CFileException::endOfFile){ LogError(LOG_STATUSBAR, GetResString(IDS_ERR_BADSERVERLIST)); } else{ TCHAR buffer[MAX_CFEXP_ERRORMSG]; error->GetErrorMessage(buffer, ARRSIZE(buffer)); LogError(LOG_STATUSBAR, GetResString(IDS_ERR_FILEERROR_SERVERMET),buffer); } error->Delete(); } theApp.emuledlg->serverwnd->serverlistctrl.SetRedraw(TRUE); theApp.emuledlg->serverwnd->serverlistctrl.Visable(); return true; }