diff --git a/src/menu_sdl.c b/src/menu_sdl.c index baa1634..7479b63 100644 --- a/src/menu_sdl.c +++ b/src/menu_sdl.c @@ -517,6 +517,11 @@ void print_font(SDL_Surface *screen, int r, int g, int b, SDL_FreeSurface(font_surf); } +int extract_screen_rzx (char *screen, FILE * fichero) +{ + return -1; +} + int extract_screen(char* screen, const char* name) { FILE *fichero; @@ -573,6 +578,21 @@ int extract_screen(char* screen, const char* name) return retorno; } + if ((ext_matches(name, ".rzx")||ext_matches(name, ".RZX"))) + { + sprintf(filename,"%s/%s",load_path_rzx, name); + fichero=fopen(filename,"rb"); + if (!fichero) //Try in the tmp zip directory + { + sprintf(filename,"%s/%s",path_tmp, name); + fichero=fopen(filename,"rb"); + if (!fichero) return -1; + } + retorno = extract_screen_rzx(screen, fichero); + fclose(fichero); + return retorno; + } + return -1; } @@ -587,12 +607,40 @@ void draw_scr_file(int x,int y, const char *selected_file, int which) char name[MAX_PATH_LENGTH]; char filename[MAX_PATH_LENGTH]; char *ptr; + char block_n[5]; + char ext[4]; + unsigned int rzx_position, block_n_int; if (selected_file==NULL) // Aborted return; - strcpy(name,selected_file); + strcpy(name,selected_file); + + if (strstr(name, "Frames:")&&(which==0)) //RZX Browser item + { + if (name[0]==']') strncpy(block_n, name+1,4); + else strncpy(block_n, name,4); + block_n[4]=0; + + block_n_int=atoi(block_n); + + if (block_n_int >(MAX_RZX_BROWSER_ITEM-1)) return; + + rzx_position=rzx_browser_list[block_n_int].position; + + if (extract_snapshot(rzx_position, load_path_snaps, ext)) return; //error + + strcpy(name, "rzxtemp."); + strcat(name, ext); + + if (extract_screen(screen, name)) return; //error + + sprintf(filename, "%s/%s", load_path_snaps, name); + unlink(filename); + } + else + { if ((ext_matches(name, ".zip")||ext_matches(name, ".ZIP"))) { //remove the zip extension @@ -634,7 +682,7 @@ void draw_scr_file(int x,int y, const char *selected_file, int which) fclose(fichero); } } - + } p_translt = ordenador.translate; p_translt2 = ordenador.translate2; diff --git a/src/rzx_lib/rzx.c b/src/rzx_lib/rzx.c index 96be9d0..6a1bf33 100644 --- a/src/rzx_lib/rzx.c +++ b/src/rzx_lib/rzx.c @@ -281,15 +281,16 @@ void set_rzxfile_position(unsigned int rzx_position) #endif } -int extract_snapshot(int position) +int extract_snapshot(unsigned int position, char *path, char *ext) { -int done=0; -long old_position, fpos; +int done=0, ret=0; +int old_position, fpos; FILE *snapfile; old_position=ftell(rzxfile); fseek(rzxfile,position,SEEK_SET); + fread(block.buff,5,1,rzxfile); fread(block.buff,12,1,rzxfile); strcpy(rzx_snap.filename,""); rzx_snap.options=0x00; @@ -301,8 +302,10 @@ old_position=ftell(rzxfile); fpos=ftell(rzxfile); rzx_popen(fpos,"rb"); #endif - strcpy(rzx_snap.filename,"rzxtemp."); + strcpy(rzx_snap.filename, path); + strcat(rzx_snap.filename,"/rzxtemp."); strcat(rzx_snap.filename,&block.buff[4]); + strcpy(ext, &block.buff[4]); #ifndef RZX_BIG_ENDIAN rzx_snap.length=*((rzx_u32*)&block.buff[8]); #else @@ -311,7 +314,7 @@ old_position=ftell(rzxfile); /* extract to tempfile */ snapfile=fopen(rzx_snap.filename,"wb"); /* if you can't, skip to next block */ - if(snapfile==NULL) return -1; + if(snapfile==NULL) {fseek(rzxfile,old_position,SEEK_SET); return -1;} /* ok */ //rzx_snap.options|=RZX_REMOVE; fpos=rzx_snap.length; @@ -332,10 +335,11 @@ old_position=ftell(rzxfile); #endif fclose(snapfile); done=0; - } + } + else ret=-1; fseek(rzxfile,old_position,SEEK_SET); - return 0; + return ret; } void rzx_close_irb() diff --git a/src/rzx_lib/rzx.h b/src/rzx_lib/rzx.h index e17da5e..2095c0a 100644 --- a/src/rzx_lib/rzx.h +++ b/src/rzx_lib/rzx.h @@ -139,6 +139,7 @@ int rzx_add_snapshot(const char *filename, const rzx_u32 flags); int rzx_add_comment(const char *text, const rzx_u32 flags); void set_rzxfile_position(unsigned int rzx_position); +int extract_snapshot(unsigned int position, char *path, char *ext); #ifdef RZX_DEBUG extern rzx_u16 INcount;