void CFriend::WriteToFile(CFileDataIO* file) { if (!m_dwHasHash) md4cpy(m_abyUserhash, sm_abyNullHash); file->WriteHash16(m_abyUserhash); file->WriteUInt32(m_dwLastUsedIP); file->WriteUInt16(m_nLastUsedPort); file->WriteUInt32(m_dwLastSeen); file->WriteUInt32(m_dwLastChatted); uint32 uTagCount = 0; ULONG uTagCountFilePos = (ULONG)file->GetPosition(); file->WriteUInt32(uTagCount); if (!m_strName.IsEmpty()){ if (WriteOptED2KUTF8Tag(file, m_strName, FF_NAME)) uTagCount++; CTag nametag(FF_NAME, m_strName); nametag.WriteTagToFile(file); uTagCount++; } file->Seek(uTagCountFilePos, CFile::begin); file->WriteUInt32(uTagCount); file->Seek(0, CFile::end); }
bool CServerList::SaveServermetToFile() { if (thePrefs.GetLogFileSaving()) AddDebugLogLine(false, _T("Saving servers list file \"%s\""), SERVER_MET_FILENAME); m_nLastSaved = ::GetTickCount(); CString newservermet(thePrefs.GetMuleDirectory(EMULE_CONFIGDIR)); newservermet += SERVER_MET_FILENAME _T(".new"); CSafeBufferedFile servermet; CFileException fexp; if (!servermet.Open(newservermet, CFile::modeWrite|CFile::modeCreate|CFile::typeBinary|CFile::shareDenyWrite, &fexp)){ // Comment UI /*CString strError(GetResString(IDS_ERR_SAVESERVERMET)); 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{ servermet.WriteUInt8(0xE0); UINT fservercount = list.GetCount(); servermet.WriteUInt32(fservercount); for (UINT j = 0; j < fservercount; j++) { const CServer* nextserver = GetServerAt(j); // don't write potential out-dated IPs of dynIP-servers servermet.WriteUInt32(nextserver->HasDynIP() ? 0 : nextserver->GetIP()); servermet.WriteUInt16(nextserver->GetPort()); UINT uTagCount = 0; ULONG uTagCountFilePos = (ULONG)servermet.GetPosition(); servermet.WriteUInt32(uTagCount); if (!nextserver->GetListName().IsEmpty()){ if (WriteOptED2KUTF8Tag(&servermet, nextserver->GetListName(), ST_SERVERNAME)) uTagCount++; CTag servername(ST_SERVERNAME, nextserver->GetListName()); servername.WriteTagToFile(&servermet); uTagCount++; } if (!nextserver->GetDynIP().IsEmpty()){ if (WriteOptED2KUTF8Tag(&servermet, nextserver->GetDynIP(), ST_DYNIP)) uTagCount++; CTag serverdynip(ST_DYNIP, nextserver->GetDynIP()); serverdynip.WriteTagToFile(&servermet); uTagCount++; } if (!nextserver->GetDescription().IsEmpty()){ if (WriteOptED2KUTF8Tag(&servermet, nextserver->GetDescription(), ST_DESCRIPTION)) uTagCount++; CTag serverdesc(ST_DESCRIPTION, nextserver->GetDescription()); serverdesc.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetFailedCount()){ CTag serverfail(ST_FAIL, nextserver->GetFailedCount()); serverfail.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetPreference() != SRV_PR_NORMAL){ CTag serverpref(ST_PREFERENCE, nextserver->GetPreference()); serverpref.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetUsers()){ CTag serveruser("users", nextserver->GetUsers()); serveruser.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetFiles()){ CTag serverfiles("files", nextserver->GetFiles()); serverfiles.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetPing()){ CTag serverping(ST_PING, nextserver->GetPing()); serverping.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetLastPingedTime()){ CTag serverlastp(ST_LASTPING, nextserver->GetLastPingedTime()); serverlastp.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetMaxUsers()){ CTag servermaxusers(ST_MAXUSERS, nextserver->GetMaxUsers()); servermaxusers.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetSoftFiles()){ CTag softfiles(ST_SOFTFILES, nextserver->GetSoftFiles()); softfiles.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetHardFiles()){ CTag hardfiles(ST_HARDFILES, nextserver->GetHardFiles()); hardfiles.WriteTagToFile(&servermet); uTagCount++; } if (!nextserver->GetVersion().IsEmpty()){ // as long as we don't receive an integer version tag from the local server (TCP) we store it as string CTag version(ST_VERSION, nextserver->GetVersion()); version.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetUDPFlags()){ CTag tagUDPFlags(ST_UDPFLAGS, nextserver->GetUDPFlags()); tagUDPFlags.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetLowIDUsers()){ CTag tagLowIDUsers(ST_LOWIDUSERS, nextserver->GetLowIDUsers()); tagLowIDUsers.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetServerKeyUDP(true)){ CTag tagServerKeyUDP(ST_UDPKEY, nextserver->GetServerKeyUDP(true)); tagServerKeyUDP.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetServerKeyUDPIP()){ CTag tagServerKeyUDPIP(ST_UDPKEYIP, nextserver->GetServerKeyUDPIP()); tagServerKeyUDPIP.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetObfuscationPortTCP()){ CTag tagObfuscationPortTCP(ST_TCPPORTOBFUSCATION, nextserver->GetObfuscationPortTCP()); tagObfuscationPortTCP.WriteTagToFile(&servermet); uTagCount++; } if (nextserver->GetObfuscationPortUDP()){ CTag tagObfuscationPortUDP(ST_UDPPORTOBFUSCATION, nextserver->GetObfuscationPortUDP()); tagObfuscationPortUDP.WriteTagToFile(&servermet); uTagCount++; } servermet.Seek(uTagCountFilePos, CFile::begin); servermet.WriteUInt32(uTagCount); servermet.SeekToEnd(); } // Comment UI /*if (thePrefs.GetCommitFiles() >= 2 || (thePrefs.GetCommitFiles() >= 1 && !theApp.emuledlg->IsRunning())){ servermet.Flush(); // flush file stream buffers to disk buffers if (_commit(_fileno(servermet.m_pStream)) != 0) // commit disk buffers to disk AfxThrowFileException(CFileException::hardIO, GetLastError(), servermet.GetFileName()); }*/ servermet.Close(); CString curservermet(thePrefs.GetMuleDirectory(EMULE_CONFIGDIR)); CString oldservermet(thePrefs.GetMuleDirectory(EMULE_CONFIGDIR)); curservermet += SERVER_MET_FILENAME; oldservermet += _T("server_met.old"); if (_taccess(oldservermet, 0) == 0) CFile::Remove(oldservermet); if (_taccess(curservermet, 0) == 0) CFile::Rename(curservermet,oldservermet); CFile::Rename(newservermet,curservermet); } catch(CFileException* error) { // Comment UI /*CString strError(GetResString(IDS_ERR_SAVESERVERMET2)); TCHAR szError[MAX_CFEXP_ERRORMSG]; if (error->GetErrorMessage(szError, ARRSIZE(szError))){ strError += _T(" - "); strError += szError; } LogError(LOG_STATUSBAR, _T("%s"), strError);*/ error->Delete(); return false; } return true; }