static ASSET * fs_copy_asset(STORAGE *me, JOB *job, ASSET *asset) { ASSET *dest; int r; (void) me; dest = asset_create(); if(!dest) { return NULL; } asset_set_path_basedir_ext(dest, job->container->path, 0, job->id->canonical, asset->ext); asset_copy_attributes(dest, asset); fprintf(stderr, "%s: %s: copying '%s' to '%s'\n", short_program_name, job->name, asset->path, dest->path); /* Perform a file-copy operation */ r = copy_file(asset->path, dest->path); if(r < 0) { asset_free(dest); return NULL; } return dest; }
void *archive_load_sound( const char *filename ) { Mix_Chunk *sound; if ( asset_acquire((void*)filename) != NULL ) return (void*)filename; sound = Mix_LoadWAV_RW( archive_open_file(filename), 1 ); if ( sound == NULL ) { fatal( "%s", Mix_GetError() ); } return asset_create( filename, sound, ASSET_SOUND ); }
void *archive_load_font( const char *filename, int size ) { void *asset; TTF_Font *font; char buf[264]; if ( asset_acquire((void*)filename) != NULL ) return (void*)filename; font = TTF_OpenFontRW( archive_open_file(filename), 1, size ); if ( font == NULL ) { fatal( "Failed to load font %s:\n%s\n", filename, TTF_GetError() ); } SDL_snprintf( buf, 256, "%s:%d", filename, size ); return asset_create( buf, font, ASSET_FONT ); }
void *archive_load_image( const char *filename ) { SDL_Texture *texture; SDL_Surface *surface; if ( asset_acquire((void*)filename) != NULL ) return (void*)filename; surface = IMG_Load_RW( archive_open_file(filename), 1 ); if ( surface == NULL ) { fatal( "%s", IMG_GetError() ); } texture = SDL_CreateTextureFromSurface( video_renderer, surface ); if ( texture == NULL ) { fatal( "%s", SDL_GetError() ); } SDL_FreeSurface( surface ); SDL_SetTextureBlendMode( texture, SDL_BLENDMODE_BLEND ); return asset_create( filename, texture, ASSET_IMAGE ); }
/* Collect a job by scanning a source directory */ static JOB * file_collect(SOURCE *me) { JOB *job; ASSET *asset; DIR *dir; struct dirent *de; const char *srcdir; size_t srclen, sl, bl; int r; srcdir = me->incoming; srclen = me->incominglen; dir = opendir(srcdir); if(!dir) { fprintf(stderr, "%s: %s: %s\n", short_program_name, srcdir, strerror(errno)); return NULL; } asset = NULL; job = NULL; for(;;) { de = readdir(dir); if(!de) { break; } if(de->d_name[0] == '.') { continue; } if(asset) { asset_reset(asset); } else { asset = asset_create(); if(!asset) { return NULL; } } asset_set_path_basedir(asset, srcdir, srclen, de->d_name); r = type_identify_asset(asset); if(r < 0) { fprintf(stderr, "%s: failed to identify asset '%s': %s\n", short_program_name, de->d_name, strerror(errno)); asset_free(asset); closedir(dir); return NULL; } if(r == 0) { continue; } if(asset->sidecar) { continue; } job = job_create(de->d_name, me); if(!job) { asset_free(asset); closedir(dir); return NULL; } job_set_source_asset(job, asset); /* Look for a matching sidecar */ asset = asset_create(); if(!asset) { return NULL; } rewinddir(dir); sl = strlen(job->asset->basename); bl = sl - strlen(job->asset->ext); for(;;) { de = readdir(dir); if(!de) { break; } if(de->d_name[0] == '.') { continue; } if(strlen(de->d_name) > sl && !strncmp(de->d_name, job->asset->basename, sl) && de->d_name[sl] == '.') { asset_reset(asset); /* Candidate filename begins with the asset filename */ asset_set_path_basedir(asset, srcdir, srclen, de->d_name); } else if(strlen(de->d_name) > bl && !strncmp(de->d_name, job->asset->basename, bl) && strcmp(de->d_name, job->asset->basename) && de->d_name[bl] == '.') { asset_reset(asset); /* Candidate filename begins with the asset filename */ asset_set_path_basedir(asset, srcdir, srclen, de->d_name); } else { continue; } r = type_identify_asset(asset); if(r < 0) { fprintf(stderr, "%s: failed to identify asset '%s': %s\n", short_program_name, de->d_name, strerror(errno)); asset_free(asset); closedir(dir); return NULL; } if(r == 0) { continue; } if(asset->sidecar) { job_set_sidecar(job, asset); asset = NULL; break; } } break; } closedir(dir); asset_free(asset); return job; }
/* Create the storage area for a job */ static ASSET * fs_create_container(STORAGE *me, JOB *job) { size_t c, max, pp, start, end; struct stat sbuf; ASSET *asset; int r; asset = asset_create(); if(!asset) { return NULL; } asset->container = 1; /* Ensure the base path is reset back to its original value */ me->path[me->pathlen] = 0; /* Construct a base path based upon HIERWIDTH and HIERDEPTH, derived * from job->id. If HIERWIDTH was 3 and HIERDEPTH was 4, the result * would be: * * path/AAA/BBB/CCC/DDD/AAABBBCCDDDEEE... */ pp = me->pathlen; max = strlen(job->id->canonical); for(c = 0; c < HIERDEPTH; c++) { start = c * HIERWIDTH; if(start > max) { break; } end = start + HIERWIDTH; if(end > max) { end = max; } me->path[pp] = '/'; pp++; memcpy(&(me->path[pp]), &(job->id->canonical[start]), end - start); pp += end - start; me->path[pp] = 0; r = stat(me->path, &sbuf); if(!r) { /* File exists */ if(S_ISDIR(sbuf.st_mode)) { /* It's a directory */ continue; } } r = mkdir(me->path, 0777); if(r < 0) { fprintf(stderr, "%s: %s: %s\n", short_program_name, me->path, strerror(errno)); asset_free(asset); return NULL; } } me->path[pp] = '/'; pp++; strcpy(&(me->path[pp]), job->id->canonical); r = mkdir(me->path, 0777); if(r < 0) { fprintf(stderr, "%s: %s: %s\n", short_program_name, me->path, strerror(errno)); asset_free(asset); return NULL; } r = asset_set_path(asset, me->path); if(r < 0) { asset_free(asset); return NULL; } me->path[me->pathlen] = 0; return asset; }