void C4FileSelDlg::AddCheckedLocation(const char *szName, const char *szPath) { // check location // path must exit if (!szPath || !*szPath) return; if (!DirectoryExists(szPath)) return; // path must not be in list yet for (int32_t i = 0; i < iLocationCount; ++i) if (ItemIdentical(szPath, pLocations[i].sPath.getData())) return; // OK; add it! AddLocation(szName, szPath); }
bool C4Network2Res::SetByCore(const C4Network2ResCore &nCore, bool fSilent, const char *szAsFilename, int32_t iRecursion) // by main thread { StdStrBuf sFilename; // try open local file const char *szFilename = szAsFilename ? szAsFilename : GetC4Filename(nCore.getFileName()); if (SetByFile(szFilename, false, nCore.getType(), nCore.getID(), nCore.getFileName(), fSilent)) { // check contents checksum if (Core.getContentsCRC() == nCore.getContentsCRC()) { // set core fDirty = true; Core = nCore; // ok then return true; } } // get and search for filename without specified folder (e.g., Castle.ocs when the opened game is Easy.ocf\Castle.ocs) const char *szFilenameOnly = GetFilename(szFilename); const char *szFilenameC4 = GetC4Filename(szFilename); if (szFilenameOnly != szFilenameC4) { sFilename.Copy(szFilename, SLen(szFilename) - SLen(szFilenameC4)); sFilename.Append(szFilenameOnly); if (SetByCore(nCore, fSilent, szFilenameOnly, Config.Network.MaxResSearchRecursion)) return true; } // if it could still not be set, try within all folders of root (ignoring special folders), and try as file outside the folder // but do not recurse any deeper than set by config (default: One folder) if (iRecursion >= Config.Network.MaxResSearchRecursion) return false; StdStrBuf sSearchPath; const char *szSearchPath; if (!iRecursion) szSearchPath = Config.General.ExePath.getData(); else { sSearchPath.Copy(szFilename, SLen(szFilename) - SLen(szFilenameC4)); szSearchPath = sSearchPath.getData(); } StdStrBuf sNetPath; sNetPath.Copy(Config.Network.WorkPath); char *szNetPath = sNetPath.GrabPointer(); TruncateBackslash(szNetPath); sNetPath.Take(szNetPath); for (DirectoryIterator i(szSearchPath); *i; ++i) if (DirectoryExists(*i)) if (!*GetExtension(*i)) // directories without extension only if (!szNetPath || !*szNetPath || !ItemIdentical(*i, szNetPath)) // ignore network path { // search for complete name at subpath (e.g. MyFolder\Easy.ocf\Castle.ocs) sFilename.Format("%s%c%s", *i, DirectorySeparator, szFilenameC4); if (SetByCore(nCore, fSilent, sFilename.getData(), iRecursion + 1)) return true; } // file could not be found locally return false; }
bool C4Language::CloseGroup(const char *strPath) { // Check all open language packs C4Group *pPack; for (int iPack = 0; (pPack = Packs.GetGroup(iPack)); iPack++) if (ItemIdentical(strPath, pPack->GetFullName().getData())) { Packs.UnregisterGroup(iPack); return true; } // No pack of that path return false; }
bool C4GameSave::SaveCreateGroup(const char *szFilename, C4Group &hUseGroup) { // erase any previous item (2do: work in C4Groups?) EraseItem(szFilename); // copy from previous group? if (GetCopyScenario()) if (!ItemIdentical(Game.ScenarioFilename, szFilename)) if (!C4Group_CopyItem(Game.ScenarioFilename, szFilename)) { LogF(LoadResStr("IDS_CNS_SAVEASERROR"), szFilename); return false; } // open it if (!hUseGroup.Open(szFilename, !GetCopyScenario())) { EraseItem(szFilename); LogF(LoadResStr("IDS_CNS_SAVEASERROR"), szFilename); return false; } // done, success return true; }
bool C4PlayerList::FileInUse(const char *szFilename) const { // Check original player files C4Player *cPlr=First; for (; cPlr; cPlr=cPlr->Next) if (ItemIdentical(cPlr->Filename,szFilename)) return true; // Compare to any network path player files with prefix (hack) if (::Network.isEnabled()) { char szWithPrefix[_MAX_PATH+1]; SCopy(GetFilename(szFilename),szWithPrefix); SetClientPrefix(szWithPrefix, Game.Clients.getLocalName()); for (cPlr=First; cPlr; cPlr=cPlr->Next) if (SEqualNoCase(GetFilename(cPlr->Filename),szWithPrefix)) return true; } // Not in use return false; }