bool C4Record::StartStreaming(bool fInitial) { if (!fRecording) return false; if (fStreaming) return false; // Get temporary file name StdCopyStrBuf sTempFilename(sFilename); MakeTempFilename(&sTempFilename); // Save start state (without copy of scenario!) C4GameSaveRecord saveRec(fInitial, Index, Game.Parameters.isLeague(), false); if (!saveRec.Save(sTempFilename.getData())) return FALSE; saveRec.Close(); // Add file into stream, delete file fStreaming = true; if (!StreamFile(sTempFilename.getData(), sFilename.getData())) { fStreaming = false; return false; } // Okay EraseFile(sTempFilename.getData()); iStreamingPos = 0; return true; }
bool C4MusicFile::RemTempFile() { if (!SongExtracted) return true; // delete it EraseFile(Config.AtTempPath(C4CFN_TempMusic2)); SongExtracted = false; return true; }
void C4Network2Res::Clear() { CStdLock FileLock(&FileCSec); // delete files if (fTempFile) if (FileExists(szFile)) if (!EraseFile(szFile)) LogSilentF("Network: Could not delete temporary resource file (%s)", strerror(errno)); if (szStandalone[0] && !SEqual(szFile, szStandalone)) if (FileExists(szStandalone)) if (!EraseFile(szStandalone)) LogSilentF("Network: Could not delete temporary resource file (%s)", strerror(errno)); szFile[0] = szStandalone[0] = '\0'; fDirty = false; fTempFile = false; Core.Clear(); Chunks.Clear(); fRemoved = false; ClearLoad(); }
bool C4VectorFont::Init(C4Group &hGrp, const char *szFilename, C4Config &rCfg) { // name by file Name.Copy(GetFilenameOnly(szFilename)); #if defined(_WIN32) && !defined(HAVE_FREETYPE) // check whether group is directory or packed if (!hGrp.IsPacked()) { // it's open: use the file directly SCopy(hGrp.GetFullName().getData(), FileName, _MAX_PATH); AppendBackslash(FileName); SAppend(szFilename, FileName); if (!FileExists(FileName)) { *FileName=0; return false; } fIsTempFile = false; } else { // it's packed: extract to temp path SCopy(rCfg.AtTempPath(szFilename), FileName, _MAX_PATH); // make sure the filename is not in use, in case multiple instances of the engine are run if (FileExists(FileName)) { RemoveExtension(FileName); StdStrBuf sNewFilename; for (int i=0; i<1000; ++i) { sNewFilename.Format("%s%x", FileName, (int)rand()); if (*GetExtension(szFilename)) { sNewFilename.AppendChar('.'); sNewFilename.Append(GetExtension(szFilename)); } if (!FileExists(sNewFilename.getData())) break; } SCopy(sNewFilename.getData(), FileName, _MAX_PATH); } if (!hGrp.ExtractEntry(szFilename, FileName)) { *FileName=0; return false; } fIsTempFile = true; } // add the font resource //if (!AddFontResourceEx(FileName, FR_PRIVATE, NULL)) requires win2k if (!AddFontResource(FileName)) { if (fIsTempFile) EraseFile(FileName); *FileName='\0'; return false; } #else if (!hGrp.LoadEntry(szFilename, Data)) return false; #endif // success return true; }
C4VectorFont::~C4VectorFont() { CStdFont::DestroyFont(pFont); // temp file loaded? if (*FileName) { // release font #if defined(_WIN32) && !defined(HAVE_FREETYPE) //RemoveFontResourceEx(FileName, FR_PRIVATE, NULL); requires win2k RemoveFontResource(FileName); #endif if (fIsTempFile) EraseFile(FileName); } }
bool C4StartupNetDlg::DoOK() { // OK in chat mode? Forward to chat control if (GetDlgMode() == SNDM_Chat) return pChatCtrl->DlgEnter(); // OK on editbox with text enetered: Add the specified IP for reference retrieval if (GetFocus() == pJoinAddressEdt) { const char *szDirectJoinAddress = pJoinAddressEdt->GetText(); if (szDirectJoinAddress && *szDirectJoinAddress) { // First do some acrobatics to avoid trying to resolve addresses with leading // or trailing whitespace, which is easily pasted in with an IP address. // We can trivially skip whitespace at the beginning, but we need a copy to // omit whitespace at the end. while (std::isspace(*szDirectJoinAddress)) // skip whitespace at the beginning ++szDirectJoinAddress; if (!*szDirectJoinAddress) // entry empty, apart from whitespace return true; const char *szDirectJoinAddressEnd = szDirectJoinAddress + std::strlen(szDirectJoinAddress) - 1; while (std::isspace(*szDirectJoinAddressEnd)) // skip whitespace at the end --szDirectJoinAddressEnd; if (*++szDirectJoinAddressEnd) { // Make a temporary copy of the part that is not trailing whitespace, if any std::string strDirectJoinAddressStripped(szDirectJoinAddress, szDirectJoinAddressEnd - szDirectJoinAddress); AddReferenceQuery(strDirectJoinAddressStripped.c_str(), C4StartupNetListEntry::NRQT_DirectJoin); } else AddReferenceQuery(szDirectJoinAddress, C4StartupNetListEntry::NRQT_DirectJoin); // Switch focus to list so another OK joins the specified address SetFocus(pGameSelList, true); return true; } } if (GetFocus() == pSearchFieldEdt) { UpdateList(); return true; } // get currently selected item C4GUI::Element *pSelection = pGameSelList->GetSelectedItem(); StdCopyStrBuf strNoJoin(LoadResStr("IDS_NET_NOJOIN")); if (!pSelection) { // no ref selected: Oh noes! ::pGUI->ShowMessageModal( LoadResStr("IDS_NET_NOJOIN_NOREF"), strNoJoin.getData(), C4GUI::MessageDialog::btnOK, C4GUI::Ico_Error); return true; } C4StartupNetListEntry *pRefEntry = static_cast<C4StartupNetListEntry *>(pSelection); const char *szError; if ((szError = pRefEntry->GetError())) { // erroneous ref selected: Oh noes! ::pGUI->ShowMessageModal( FormatString(LoadResStr("IDS_NET_NOJOIN_BADREF"), szError).getData(), strNoJoin.getData(), C4GUI::MessageDialog::btnOK, C4GUI::Ico_Error); return true; } C4Network2Reference *pRef = pRefEntry->GetReference(); const char *szDirectJoinAddress = pRefEntry->GetJoinAddress(); if (!pRef && !(szDirectJoinAddress && *szDirectJoinAddress)) { // something strange has been selected (e.g., a masterserver entry). Error. ::pGUI->ShowMessageModal( LoadResStr("IDS_NET_NOJOIN_NOREF"), strNoJoin.getData(), C4GUI::MessageDialog::btnOK, C4GUI::Ico_Error); return true; } // check if join to this reference is possible at all if (pRef) { // version mismatch C4GameVersion verThis; if (!(pRef->getGameVersion() == verThis)) { ::pGUI->ShowMessageModal( FormatString(LoadResStr("IDS_NET_NOJOIN_BADVER"), pRef->getGameVersion().GetString().getData(), verThis.GetString().getData()).getData(), strNoJoin.getData(), C4GUI::MessageDialog::btnOK, C4GUI::Ico_Error); return true; } if (pRef->getGameStatus().isPastLobby()) { // no runtime join if (!pRef->isJoinAllowed()) { if (!::pGUI->ShowMessageModal( LoadResStr("IDS_NET_NOJOIN_NORUNTIME"), strNoJoin.getData(), C4GUI::MessageDialog::btnYes | C4GUI::MessageDialog::btnNo, C4GUI::Ico_Error)) { return true; } } else { if (!::pGUI->ShowMessageModal( LoadResStr("IDS_NET_NOJOIN_RUNTIMEBROKEN"), strNoJoin.getData(), C4GUI::MessageDialog::btnYes | C4GUI::MessageDialog::btnNo, C4GUI::Ico_Error)) { return true; } } } } // OK; joining! if (pRef->isEditor()) { bool success = false; // Editor mode join: Serialize reference to temp file and join on that // (could pass through environment, but that's hard to do platform-independent // (QProcessEnvironment? But then there's a Qt dependency in the network init code)) StdStrBuf tmpfn(Config.AtTempPath("ocjoin"), true); MakeTempFilename(&tmpfn); StdStrBuf join_data = DecompileToBuf<StdCompilerINIWrite>(mkNamingAdapt(*pRef, "Reference")); if (join_data.getSize()) { if (join_data.SaveToFile(tmpfn.getData())) { if (RestartApplication({"--editor", FormatString("--join=%s%s", C4Game::DirectJoinFilePrefix, tmpfn.getData()).getData()})) // hope for no " in temp path { // Application.Quit() has been called. Will quit after returning from this callback. // The temp file will be deleted by the new instance success = true; } else { EraseFile(tmpfn.getData()); } } } if (!success) { C4GUI::TheScreen.ShowErrorMessage(LoadResStr("IDS_ERR_STARTEDITOR")); } return true; } else { // Player mode join // Take over reference pRefEntry->GrabReference(); // Set join parameters *Game.ScenarioFilename = '\0'; if (szDirectJoinAddress) SCopy(szDirectJoinAddress, Game.DirectJoinAddress, _MAX_PATH); else *Game.DirectJoinAddress = '\0'; SCopy("Objects.ocd", Game.DefinitionFilenames); Game.NetworkActive = true; Game.fObserve = false; Game.pJoinReference.reset(pRef); // start with this set! Application.OpenGame(); return true; } }