Example #1
0
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 ) );
	}
}
Example #2
0
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;
}