Ejemplo n.º 1
0
Archivo: fs.c Proyecto: nevali/spool
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;
}
Ejemplo n.º 2
0
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 );
}
Ejemplo n.º 3
0
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 );
}
Ejemplo n.º 4
0
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 );
}
Ejemplo n.º 5
0
Archivo: file.c Proyecto: nevali/spool
/* 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;
}
Ejemplo n.º 6
0
Archivo: fs.c Proyecto: nevali/spool
/* 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;
}