void StreamCache::Init() { bool cacheEmpty = true; // remove the cache dir on the 1st and 15nth days of month time_t long_time; struct tm *nt; // date & time time( &long_time ); // purge cache on the given date if( ui_cachepurgedate->string[0] != '\0') { int year, month, day; cacheEmpty = false; if( sscanf( ui_cachepurgedate->string, "%i-%i-%i", &year, &month, &day ) == 3 ) { struct tm purgetime; memset( &purgetime, 0, sizeof( purgetime ) ); purgetime.tm_year = year - 1900; purgetime.tm_mon = month - 1; purgetime.tm_mday = day; if( long_time >= mktime( &purgetime ) ) { PurgeCache(); cacheEmpty = true; } } } // set next date & time if( cacheEmpty ) { long_time += time_t( WSW_UI_STREAMCACHE_CACHE_PURGE_INTERVAL ) * 24 * 60 * 60; nt = localtime( &long_time ); trap::Cvar_ForceSet( ui_cachepurgedate->name, va( "%04i-%02i-%02i", nt->tm_year + 1900, nt->tm_mon+1, nt->tm_mday ) ); } }
int main(int argc,char **argv){ ProgData pdata; int exit_status = 0; SetupDefaultArgs(&pdata.args); if (!ParseArgs(argc, argv, &pdata.args)) { exit(1); } if (pdata.args.rescue_path != NULL) { exit(rmdRescue(pdata.args.rescue_path)); } if(XInitThreads ()==0){ fprintf(stderr,"Couldn't initialize thread support!\n"); exit(7); } if(pdata.args.display!=NULL){ pdata.dpy = XOpenDisplay(pdata.args.display); XSetErrorHandler(rmdErrorHandler); } else{ fprintf(stderr,"No display specified for connection!\n"); exit(8); } if (pdata.dpy == NULL) { fprintf(stderr, "Cannot connect to X server %s\n",pdata.args.display); exit(9); } else{ EncData enc_data; CacheData cache_data; #ifdef HAVE_LIBJACK JackData jdata; // Give jack access to program data, mainly for program state jdata.pdata = &pdata; pdata.jdata = &jdata; #endif // Query display specs pdata.specs.screen = DefaultScreen(pdata.dpy); pdata.specs.width = DisplayWidth(pdata.dpy, pdata.specs.screen); pdata.specs.height = DisplayHeight(pdata.dpy, pdata.specs.screen); pdata.specs.root = RootWindow(pdata.dpy, pdata.specs.screen); pdata.specs.visual = DefaultVisual(pdata.dpy, pdata.specs.screen); pdata.specs.gc = DefaultGC(pdata.dpy, pdata.specs.screen); pdata.specs.depth = DefaultDepth(pdata.dpy, pdata.specs.screen); if((pdata.specs.depth!=32)&& (pdata.specs.depth!=24)&& (pdata.specs.depth!=16)){ fprintf(stderr,"Only 32bpp,24bpp and 16bpp" " color depth modes are currently supported.\n"); exit(10); } if (!SetBRWindow(pdata.dpy, &pdata.brwin, &pdata.specs, &pdata.args)) exit(11); if( !pdata.args.nowmcheck && rmdWMIsCompositing( pdata.dpy, pdata.specs.screen ) ) { fprintf(stderr,"\nDetected compositing window manager.\n" "Reverting to full screen capture at every frame.\n" "To disable this check run with --no-wm-check\n" "(though that is not advised, since it will " "probably produce faulty results).\n\n"); pdata.args.full_shots=1; pdata.args.noshared=0; } QueryExtensions(pdata.dpy, &pdata.args, &pdata.damage_event, &pdata.damage_error, &pdata.shm_opcode); if((exit_status=InitializeData(&pdata,&enc_data,&cache_data))==0){ if(!strcmp(pdata.args.pause_shortcut, pdata.args.stop_shortcut)|| RegisterShortcut(pdata.dpy, pdata.specs.root, pdata.args.pause_shortcut, &(pdata.pause_key)) || RegisterShortcut(pdata.dpy, pdata.specs.root, pdata.args.stop_shortcut, &(pdata.stop_key))){ fprintf(stderr,"Invalid shortcut," " or shortcuts are the same!\n\n" "Using defaults.\n"); RegisterShortcut(pdata.dpy, pdata.specs.root, "Control+Mod1+p", &(pdata.pause_key)); RegisterShortcut(pdata.dpy, pdata.specs.root, "Control+Mod1+s", &(pdata.stop_key)); } //this is where the capturing happens. rmdThreads(&pdata); XCloseDisplay(pdata.dpy); fprintf(stderr,".\n"); //encode and then cleanup cache if(!pdata.args.encOnTheFly && !pdata.args.no_encode){ if (!pdata.aborted) { EncodeCache(&pdata); } fprintf(stderr,"Cleanning up cache...\n"); if(PurgeCache(pdata.cache_data,!pdata.args.nosound)) fprintf(stderr,"Some error occured " "while cleaning up cache!\n"); fprintf(stderr,"Done!!!\n"); } if (pdata.aborted && pdata.args.encOnTheFly) { if(remove(pdata.args.filename)){ perror("Error while removing file:\n"); return 1; } else{ fprintf(stderr,"SIGABRT received,file %s removed\n", pdata.args.filename); return 0; } } else fprintf(stderr,"Goodbye!\n"); CleanUp(); } } return exit_status; }