void SaveConfig(const char *cfgname) { char filename[MAX_PATH] = {0}, *filename_ext, *backupname_ext; size_t len; FILE *f; snprintf(filename, sizeof(filename) - 4, "%s", cfgname[0] ? cfgname : MAIN_CONFIG_FILENAME); // use config.cfg if no params was specified COM_ForceExtensionEx (filename, ".cfg", sizeof (filename)); if (cfg_backup.integer) { if (cfg_use_home.integer) // homedir filename_ext = va("%s/%s/%s", com_homedir, (strcmp(com_gamedirfile, "qw") == 0 || !cfg_use_gamedir.integer) ? "" : com_gamedirfile, filename); else // basedir filename_ext = va("%s/%s/configs/%s", com_basedir, (strcmp(com_gamedirfile, "qw") == 0 || !cfg_use_gamedir.integer) ? "ezquake" : com_gamedirfile, filename); if ((f = fopen(filename_ext, "r"))) { fclose(f); len = strlen(filename_ext) + 5; backupname_ext = (char *) Q_malloc(len); snprintf (backupname_ext, len, "%s.bak", filename_ext); if ((f = fopen(backupname_ext, "r"))) { fclose(f); remove(backupname_ext); } rename(filename_ext, backupname_ext); Q_free(backupname_ext); } } DumpConfig(filename); filesystemchanged = true; // fix bug 2359900 }
// Playlist functions void MP3_WINAMP_LoadPlaylist_f(void) { COPYDATASTRUCT cds; char playlist[64]; if (Cmd_Argc() == 1) { Com_Printf("Usage: %s <filename>\n", Cmd_Argv(0)); return; } if (!MP3_WINAMP_IsPlayerRunning()) { Com_Printf("%s is not running\n", mp3_player->PlayerName_LeadingCaps); return; } strlcpy(playlist, Cmd_Args(), sizeof(playlist)); if (!strcmp(COM_FileExtension(playlist), "pls")) { Com_Printf("Error: .pls playlists are not supported. Try loading a .m3u playlist\n"); return; } COM_ForceExtensionEx (playlist, ".m3u", sizeof (playlist)); SendMessage(mp3_hwnd, WM_WA_IPC, 0, IPC_DELETE); cds.dwData = IPC_PLAYFILE; cds.lpData = playlist; cds.cbData = strlen(playlist) + 1; SendMessage(mp3_hwnd, WM_COPYDATA, (WPARAM) NULL, (LPARAM) &cds); }
/* example how it works === ./ezquake -game testmod -config testcfg homedir/testmod/testcfg.cfg (fullname) homedir/testcfg.cfg (fullname_moddefault) quakedir/testmod/configs/testcfg.cfg quakedir/ezquake/configs/testcfg.cfg built-in ezquake config */ void LoadConfig_f(void) { FILE *f = NULL; char filename[MAX_PATH] = {0}, fullname[MAX_PATH] = {0}, fullname_moddefault[MAX_PATH] = {0}, *arg1; int use_home; arg1 = COM_SkipPathWritable(Cmd_Argv(1)); snprintf(filename, sizeof(filename) - 4, "%s", arg1[0] ? arg1 : MAIN_CONFIG_FILENAME); // use config.cfg if no params was specified COM_ForceExtensionEx (filename, ".cfg", sizeof (filename)); use_home = cfg_use_home.integer || !host_everything_loaded; // home snprintf(fullname, sizeof(fullname), "%s/%s%s", com_homedir, (strcmp(com_gamedirfile, "qw") == 0) ? "" : va("%s/", com_gamedirfile), filename); snprintf(fullname_moddefault, sizeof(fullname_moddefault), "%s/%s", com_homedir, filename); if(use_home && !((f = fopen(fullname, "rb")) && cfg_use_gamedir.integer) && !(f = fopen(fullname_moddefault, "rb"))) { use_home = false; } // basedir snprintf(fullname, sizeof(fullname), "%s/%s/configs/%s", com_basedir, (strcmp(com_gamedirfile, "qw") == 0) ? "ezquake" : com_gamedirfile, filename); snprintf(fullname_moddefault, sizeof(fullname_moddefault), "%s/ezquake/configs/%s", com_basedir, filename); if(!use_home && !((f = fopen(fullname, "rb")) && cfg_use_gamedir.integer) && !(f = fopen(fullname_moddefault, "rb"))) { Com_Printf("Couldn't load %s %s\n", filename, (cfg_use_gamedir.integer) ? "(using gamedir search)": "(not using gamedir search)"); return; } con_suppress = true; ResetConfigs(false, true); con_suppress = false; if(use_home) Com_Printf("Loading %s%s (Using Home Directory) ...\n", (strcmp(com_gamedirfile, "qw") == 0) ? "" : va("%s/",com_gamedirfile), filename); else Com_Printf("Loading %s/configs/%s ...\n", (strcmp(com_gamedirfile, "qw") == 0) ? "ezquake" : com_gamedirfile, filename); Cbuf_AddText ("cl_warncmd 0\n"); LoadCfg(f); fclose(f); /* johnnycz: This should be called with TP_ExecTrigger("f_cfgload"); but definition of f_cfgload alias is stored in config which is waiting to be executed in command queue so nothing would happen. We have to add f_cfgload as a standard command to the queue. Since warnings are off this is OK but regarding to other f_triggers non-standard. */ Cbuf_AddText ("f_cfgload\n"); Cbuf_AddText ("cl_warncmd 1\n"); }
void Log_AutoLogging_StartMatch(char *logname) { char extendedname[MAX_OSPATH * 2], *fullname; FILE *templog; void *buf; temp_log_ready = false; if (!match_auto_logconsole.value) return; if (Log_IsLogging()) { if (autologging) { autologging = false; Log_Stop(); } else { Com_Printf("Auto console logging skipped (already logging)\n"); return; } } strlcpy(auto_matchname, logname, sizeof(auto_matchname)); strlcpy (extendedname, TEMP_LOG_NAME, sizeof(extendedname)); COM_ForceExtensionEx (extendedname, ".log", sizeof (extendedname)); fullname = va("%s/%s", MT_TempDirectory(), extendedname); if (!(templog = fopen (fullname, log_readable.value ? "w" : "wb"))) { FS_CreatePath(fullname); if (!(templog = fopen (fullname, log_readable.value ? "w" : "wb"))) { Com_Printf("Error: Couldn't open %s\n", fullname); return; } } buf = Q_calloc(1, LOGFILEBUFFER); if (!buf) { Com_Printf("Not enough memory to allocate log buffer\n"); return; } memlogfile = FSMMAP_OpenVFS(buf, LOGFILEBUFFER); Com_Printf ("Auto console logging commenced\n"); logfile = templog; autologging = true; auto_starttime = cls.realtime; }
void DumpHUD_f(void) { char *filename; char buf[MAX_PATH]; if (Cmd_Argc() != 2) { Com_Printf("Usage: %s <filename>\n", Cmd_Argv(0)); return; } filename = COM_SkipPathWritable(Cmd_Argv(1)); strlcpy(buf, filename, sizeof(buf)); COM_ForceExtensionEx (buf, ".cfg", sizeof(buf)); DumpHUD(buf); Com_Printf("HUD variables exported to %s\n",buf); }
void SaveConfig_f(void) { char filename[MAX_PATH] = {0}, *filename_ext, *backupname_ext; const char* arg1; size_t len; FILE *f; arg1 = COM_SkipPath(Cmd_Argv(1)); snprintf(filename, sizeof(filename) - 4, "%s", arg1[0] ? arg1 : "config.cfg"); // use config.cfg if no params was specified COM_ForceExtensionEx (filename, ".cfg", sizeof (filename)); if (cfg_backup.integer) { if (cfg_use_home.integer) // use home dir for cfg filename_ext = va("%s/%s", com_homedir, filename); else // use ezquake dir filename_ext = va("%s/ezquake/configs/%s", com_basedir, filename); if ((f = fopen(filename_ext, "r"))) { fclose(f); len = strlen(filename_ext) + 5; backupname_ext = (char *) Q_malloc(len); snprintf (backupname_ext, len, "%s.bak", filename_ext); if ((f = fopen(backupname_ext, "r"))) { fclose(f); remove(backupname_ext); } rename(filename_ext, backupname_ext); Q_free(backupname_ext); } } DumpConfig(filename); Com_Printf("Saving configuration to %s\n", filename); }
// well exec /home/qqshka/ezquake/config.cfg does't work, security or something, so adding this // so this is some replacement for exec void LoadHomeCfg(const char *filename) { char fullname[MAX_PATH] = {0}, *fileBuffer; int size; FILE *f; snprintf(fullname, sizeof(fullname) - 4, "%s/%s", com_homedir, filename); COM_ForceExtensionEx (fullname, ".cfg", sizeof (fullname)); if (!(f = fopen(fullname, "rb"))) { Com_DPrintf("LoadHomeCfg: %s not found\n", filename); // hrm return; } size = FS_FileLength(f); fileBuffer = Q_malloc(size + 1); // +1 for null terminator fread(fileBuffer, 1, size, f); fileBuffer[size] = 0; fclose(f); Cbuf_AddText (fileBuffer); Cbuf_AddText ("\n"); Q_free(fileBuffer); }
void Movie_Demo_Capture_f(void) { int argc; double time; char *error; #ifdef _WIN32 error = va("Usage: %s <start time [avifile] | stop>\n", Cmd_Argv(0)); if ((argc = Cmd_Argc()) != 2 && argc != 3 && argc != 4) { #else error = va("Usage: %s <start time | stop>\n", Cmd_Argv(0)); if ((argc = Cmd_Argc()) != 2 && argc != 3) { #endif Com_Printf(error); return; } if (argc == 2) { if (strncasecmp("stop", Cmd_Argv(1), 4)) Com_Printf(error); else if (Movie_IsCapturing()) Movie_Stop(); else Com_Printf("%s : Not capturing\n", Cmd_Argv(0)); return; } if (strncasecmp("start", Cmd_Argv(1), 5)) { Com_Printf(error); return; } else if (Movie_IsCapturing()) { Com_Printf("%s : Already capturing\n", Cmd_Argv(0)); return; } if (!cls.demoplayback || cls.timedemo) { Com_Printf("%s : Must be playing a demo to capture\n", Cmd_Argv(0)); return; } if ((time = Q_atof(Cmd_Argv(2))) <= 0) { Com_Printf("%s : Time argument must be positive\n", Cmd_Argv(0)); return; } #ifdef _WIN32 //joe: capturing to avi if (argc == 4) { avi_number = 0; strlcpy(movie_avi_filename, Cmd_Argv(3), sizeof(movie_avi_filename)-10); // Store user's requested filename if (!movie_avi_loaded) { Com_Printf_State (PRINT_FAIL, "Avi capturing not initialized\n"); return; } Movie_Start_AVI_Capture(movie_vid_maxlen.value > 0 && movie_vid_maxlen.value < time); } #endif Movie_Start(time); } #ifdef _WIN32 static void Movie_Start_AVI_Capture(qbool split) { ++avi_number; // If we're going to break up the movie, append number char aviname[MAX_OSPATH]; if (split) snprintf (aviname, sizeof(aviname), "%s-%03d", movie_avi_filename, avi_number); else strlcpy (aviname, movie_avi_filename, sizeof(aviname)); if (!(Util_Is_Valid_Filename(aviname))) { Com_Printf(Util_Invalid_Filename_Msg(aviname)); return; } COM_ForceExtensionEx (aviname, ".avi", sizeof (aviname)); snprintf (avipath, sizeof(avipath), "%s/%s/%s", com_basedir, movie_dir.string, aviname); if (!(avifile = fopen(avipath, "wb"))) { FS_CreatePath (avipath); if (!(avifile = fopen(avipath, "wb"))) { Com_Printf("Error: Couldn't open %s\n", aviname); return; } } }
static void Log_log_f(void) { char *fulllogname; FILE *templog; switch (Cmd_Argc()) { case 1: if (autologging) Com_Printf("Auto console logging is in progress\n"); else if (Log_IsLogging()) Com_Printf("Logging to %s\n", logfilename); else Com_Printf("Not logging\n"); return; case 2: if (!strcasecmp(Cmd_Argv(1), "stop")) { if (autologging) { Log_AutoLogging_StopMatch(); } else { if (Log_IsLogging()) { Log_Stop(); Com_Printf("Stopped logging to %s\n", logfilename); } else { Com_Printf("Not logging\n"); } } return; } if (autologging) { Com_Printf("Auto console logging must be stopped first!\n"); return; } if (Log_IsLogging()) { Log_Stop(); Com_Printf("Stopped logging to %s\n", logfilename); } strlcpy(logfilename, Cmd_Argv(1), sizeof(logfilename) - 4); Util_Process_Filename(logfilename); if (!Util_Is_Valid_Filename(logfilename)) { Com_Printf(Util_Invalid_Filename_Msg("filename")); return; } COM_ForceExtensionEx (logfilename, ".log", sizeof (logfilename)); fulllogname = va("%s/%s", Log_LogDirectory(), logfilename); if (!(templog = fopen (fulllogname, log_readable.value ? "w" : "wb"))) { FS_CreatePath(fulllogname); if (!(templog = fopen (fulllogname, log_readable.value ? "w" : "wb"))) { Com_Printf("Error: Couldn't open %s\n", logfilename); return; } } Com_Printf("Logging to %s\n", logfilename); logfile = templog; break; default: Com_Printf("Usage: %s [filename | stop]\n", Cmd_Argv(0)); return; } }
void Host_Init (int argc, char **argv, int default_memsize) { vfsfile_t *vf; cvar_t *v; char cfg[MAX_PATH] = {0}; int i; char *cfg_name; COM_InitArgv (argc, argv); COM_StoreOriginalCmdline(argc, argv); #ifdef WITH_DP_MEM Memory2_Init (); #endif Host_InitMemory (default_memsize); #ifdef WITH_TCL // interpreter should be initialized // before any cvar definitions TCL_InterpInit (); #endif Cbuf_Init (); Cmd_Init (); Cvar_Init (); COM_Init (); Key_Init (); #ifdef WITH_DP_MEM Memory2_Init_Commands (); #endif Cache_Init_Commands (); FS_InitFilesystem (); NET_Init (); Commands_For_Configs_Init (); ConfigManager_Init(); ResetBinds(); i = COM_CheckParm("+cfg_load"); if (i && (i + 1 < COM_Argc())) { cfg_name = COM_Argv(i + 1); } else { cfg_name = MAIN_CONFIG_FILENAME; } snprintf(cfg, sizeof(cfg), "%s", cfg_name); COM_ForceExtensionEx (cfg, ".cfg", sizeof (cfg)); Cbuf_AddText(va("cfg_load %s\n", cfg)); Cbuf_Execute(); Cbuf_AddEarlyCommands (); Cbuf_Execute (); Con_Init (); NET_InitClient (); Netchan_Init (); #if (!defined WITH_PNG_STATIC || !defined WITH_JPEG_STATIC || defined WITH_MP3_PLAYER) QLib_Init(); #endif Sys_Init (); CM_Init (); PM_Init (); Mod_Init (); SV_Init (); CL_Init (); Cvar_CleanUpTempVars (); SYSINFO_Init(); #ifdef WITH_TCL if (!TCL_InterpLoaded()) Com_Printf_State (PRINT_FAIL, "Could not load "TCL_LIB_NAME", embedded Tcl disabled\n"); #endif Hunk_AllocName (0, "-HOST_HUNKLEVEL-"); host_hunklevel = Hunk_LowMark (); host_initialized = true; // walk through all vars and forse OnChange event if cvar was modified, // also apply that to variables which mirrored in userinfo because of cl_parsefunchars was't applyed as this moment, // same for serverinfo and may be this fix something also. for ( v = NULL; (v = Cvar_Next ( v )); ) { char val[2048]; // if ( !v->modified ) // continue; // not modified even that strange at this moment if ( Cvar_GetFlags( v ) & (CVAR_ROM | CVAR_INIT) ) continue; snprintf(val, sizeof(val), "%s", v->string); Cvar_Set(v, val); } Hud_262LoadOnFirstStart(); Com_Printf_State (PRINT_INFO, "Exe: "__TIME__" "__DATE__"\n"); Com_Printf_State (PRINT_INFO, "Hunk allocation: %4.1f MB.\n", (float) host_memsize / (1024 * 1024)); Com_Printf ("\nezQuake %s\n\n", VersionString()); Com_Printf(Host_PrintBars("ezQuake\x9c" "SourceForge\x9c" "net", 38)); Com_Printf(Host_PrintBars("ezQuake Initialized", 38)); Com_Printf("\n"); Com_Printf ("\nType /help to access the manual.\nUse /describe to learn about commands.\n", VersionString()); if ((vf = FS_OpenVFS("autoexec.cfg", "rb", FS_ANY))) { Cbuf_AddText ("exec autoexec.cfg\n"); VFS_CLOSE(vf); } Cmd_StuffCmds_f (); // process command line arguments Cbuf_AddText ("cl_warncmd 1\n"); #ifdef WIN32 // // Verify that ezQuake is associated with the QW:// protocl handler. // { extern qbool CL_CheckIfQWProtocolHandler(); extern cvar_t cl_verify_qwprotocol; if (cl_verify_qwprotocol.integer >= 2) { // Always register the qw:// protocol. Cbuf_AddText("register_qwurl_protocol\n"); } else if (cl_verify_qwprotocol.integer == 1 && !CL_CheckIfQWProtocolHandler()) { // Check if the running exe is the one associated with the qw:// protocol. Com_PrintVerticalBar(0.8 * vid.conwidth / 8); Com_Printf("\n"); Com_Printf("This ezQuake is not associated with the "); Com_Printf("\x02QW:// protocol.\n"); Com_Printf("Register it using "); Com_Printf("\x02/register_qwurl_protocol\n"); Com_Printf("(set "); Com_Printf("\x02 cl_verify_qwprotocol "); Com_Printf("to 0 to hide this warning)\n"); Com_PrintVerticalBar(0.8 * vid.conwidth / 8); Com_Printf("\n"); } } #endif // WIN32 // Check if a qtv/demo file is specified as the first argument, in that case play that // otherwise, do some more checks of what to show at startup. { char cmd[1024] = {0}; if (COM_CheckArgsForPlayableFiles(cmd, sizeof(cmd))) { Cbuf_AddText(cmd); } else { Startup_Place(); } } #ifdef _WIN32 SetForegroundWindow(mainwindow); SetActiveWindow(mainwindow); #endif host_everything_loaded = true; }
void LoadConfig_f(void) { FILE *f; char filename[MAX_PATH] = {0}, fullname[MAX_PATH] = {0}, *arg1; int use_home; /* load config.cfg by default if no params if (Cmd_Argc() != 2) { Com_Printf("Usage: %s <filename>\n", Cmd_Argv(0)); return; } */ arg1 = COM_SkipPathWritable(Cmd_Argv(1)); snprintf(filename, sizeof(filename) - 4, "%s", arg1[0] ? arg1 : "config.cfg"); // use config.cfg if no params was specified COM_ForceExtensionEx (filename, ".cfg", sizeof (filename)); use_home = cfg_use_home.integer; if (use_home) // use home dir for cfg snprintf(fullname, sizeof(fullname), "%s/%s", com_homedir, filename); else // use ezquake dir snprintf(fullname, sizeof(fullname), "%s/ezquake/configs/%s", com_basedir, filename); if (!(f = fopen(fullname, "r"))) { use_home = !use_home; // cfg was't found, invert setting and repeat search, mostly this need only at load time if (use_home) // use home dir for cfg snprintf(fullname, sizeof(fullname), "%s/%s", com_homedir, filename); else // use ezquake dir snprintf(fullname, sizeof(fullname), "%s/ezquake/configs/%s", com_basedir, filename); if (!(f = fopen(fullname, "r"))) { Com_Printf("Couldn't load config %s\n", filename); return; } } fclose(f); con_suppress = true; ResetConfigs(false, true); con_suppress = false; Com_Printf("Loading config %s ...\n", filename); Cbuf_AddText ("cl_warncmd 0\n"); if (use_home) LoadHomeCfg(filename); // well, we can't use exec here, because exec does't support full path by design else Cbuf_AddText(va("exec configs/%s\n", filename)); /* johnnycz: This should be called with TP_ExecTrigger("f_cfgload"); but definition of f_cfgload alias is stored in config which is waiting to be executed in command queue so nothing would happen. We have to add f_cfgload as a standard command to the queue. Since warnings are off this is OK but regarding to other f_triggers non-standard. */ Cbuf_AddText ("f_cfgload\n"); Cbuf_AddText ("cl_warncmd 1\n"); }
void Movie_Demo_Capture_f(void) { int argc; double time; char *error; #ifdef _WIN32 error = va("Usage: %s <start time [avifile] | stop>\n", Cmd_Argv(0)); if ((argc = Cmd_Argc()) != 2 && argc != 3 && argc != 4) { #else error = va("Usage: %s <start time | stop>\n", Cmd_Argv(0)); if ((argc = Cmd_Argc()) != 2 && argc != 3) { #endif Com_Printf(error); return; } if (argc == 2) { if (strncasecmp("stop", Cmd_Argv(1), 4)) Com_Printf(error); else if (Movie_IsCapturing()) Movie_Stop(); else Com_Printf("%s : Not capturing\n", Cmd_Argv(0)); return; } if (strncasecmp("start", Cmd_Argv(1), 5)) { Com_Printf(error); return; } else if (Movie_IsCapturing()) { Com_Printf("%s : Already capturing\n", Cmd_Argv(0)); return; } if (!cls.demoplayback || cls.timedemo) { Com_Printf("%s : Must be playing a demo to capture\n", Cmd_Argv(0)); return; } if ((time = Q_atof(Cmd_Argv(2))) <= 0) { Com_Printf("%s : Time argument must be positive\n", Cmd_Argv(0)); return; } #ifdef _WIN32 //joe: capturing to avi if (argc == 4) { char aviname[MAX_OSPATH]; if (!movie_avi_loaded) { Com_Printf_State (PRINT_FAIL, "Avi capturing not initialized\n"); return; } strlcpy (aviname, Cmd_Argv(3), sizeof(aviname)); if (!(Util_Is_Valid_Filename(aviname))) { Com_Printf(Util_Invalid_Filename_Msg(aviname)); return; } COM_ForceExtensionEx (aviname, ".avi", sizeof (aviname)); snprintf (avipath, sizeof(avipath), "%s/%s/%s", com_basedir, movie_dir.string, aviname); if (!(avifile = fopen(avipath, "wb"))) { FS_CreatePath (avipath); if (!(avifile = fopen(avipath, "wb"))) { Com_Printf("Error: Couldn't open %s\n", aviname); return; } } } #endif Movie_Start(time); } void Movie_Init(void) { Cvar_SetCurrentGroup(CVAR_GROUP_DEMO); Cvar_Register(&movie_fps); Cvar_Register(&movie_dir); Cvar_Register(&movie_steadycam); Cvar_ResetCurrentGroup(); Cmd_AddCommand("demo_capture", Movie_Demo_Capture_f); #ifdef _WIN32 Capture_InitAVI (); //joe: capturing to avi if (!movie_avi_loaded) return; captured_audio_samples = 0; Cvar_SetCurrentGroup(CVAR_GROUP_DEMO); Cvar_Register(&movie_codec); Cvar_ResetCurrentGroup(); Capture_InitACM (); if (!movie_acm_loaded) return; Cvar_SetCurrentGroup(CVAR_GROUP_DEMO); Cvar_Register(&movie_mp3); Cvar_Register(&movie_mp3_kbps); Cvar_ResetCurrentGroup(); #endif }