예제 #1
0
MemoryStream::MemoryStream(char *name, void* data, unsigned long size)
	: data((char*)data)
{
	this->size = size;
	ExtractFileFromPath(filename, name);
	strncpy(originalfile, name, _MAX_PATH);
}
예제 #2
0
bool FileStream::Create(const char *folder, const char* fname, SClass_ID ClassID)
{
	char path[_MAX_PATH];
	char filename[_MAX_PATH];
	ExtractFileFromPath( filename, fname );
	PathJoinExt(path, folder, filename, core->TypeExt(ClassID));
	return Create(path);
}
예제 #3
0
int BIFImporter::OpenArchive(const char* path)
{
	if (stream) {
		delete( stream );
		stream = NULL;
	}

	char filename[_MAX_PATH];
	ExtractFileFromPath(filename, path);

	char cachePath[_MAX_PATH];
	PathJoin(cachePath, core->CachePath, filename, NULL);
	stream = FileStream::OpenFile(cachePath);

	char Signature[8];
	if (!stream) {
		FileStream* file = FileStream::OpenFile(path);
		if (!file) {
			return GEM_ERROR;
		}
		if (file->Read(Signature, 8) == GEM_ERROR) {
			delete file;
			return GEM_ERROR;
		}

		if (strncmp(Signature, "BIF V1.0", 8) == 0) {
			stream = DecompressBIF(file, cachePath);
			delete file;
		} else if (strncmp(Signature, "BIFCV1.0", 8) == 0) {
			stream = DecompressBIFC(file, cachePath);
			delete file;
		} else if (strncmp( Signature, "BIFFV1  ", 8 ) == 0) {
			file->Seek(0, GEM_STREAM_START);
			stream = file;
		} else {
			delete file;
			return GEM_ERROR;
		}
	}

	if (!stream)
		return GEM_ERROR;

	stream->Read( Signature, 8 );

	if (strncmp( Signature, "BIFFV1  ", 8 ) != 0) {
		return GEM_ERROR;
	}

	ReadBIF();
	return GEM_OK;
}
CachedFileStream::CachedFileStream(const char* stream, bool autoFree)
{
	ExtractFileFromPath( filename, stream );
	PathJoin( originalfile, core->CachePath, filename, NULL );

	str = _fopen( originalfile, "rb" );
	if (str == NULL) {    // File was not found in cache
		if (core->GameOnCD) {
			_FILE* src = _fopen( stream, "rb" );
#ifdef _DEBUG
			core->CachedFileStreamPtrCount++;
#endif
			_FILE* dest = _fopen( originalfile, "wb" );
#ifdef _DEBUG
			core->CachedFileStreamPtrCount++;
#endif
			void* buff = malloc( 1024 * 1000 );
			do {
				size_t len = _fread( buff, 1, 1024 * 1000, src );
				size_t c = _fwrite( buff, 1, len, dest );
				if (c != len) {
					printf("CachedFileStream failed to write to cached file '%s' (from '%s')\n", originalfile, stream);
					abort();
				}
			} while (!_feof( src ));
			free( buff );
			_fclose( src );
#ifdef _DEBUG
			core->CachedFileStreamPtrCount--;
#endif
			_fclose( dest );
#ifdef _DEBUG
			core->CachedFileStreamPtrCount--;
#endif
		} else {  // Don't cache files already on hdd
			strncpy(originalfile, stream, _MAX_PATH);
		}
		str = _fopen( originalfile, "rb" );
	}
#ifdef _DEBUG
	core->CachedFileStreamPtrCount++;
#endif
	startpos = 0;
	_fseek( str, 0, SEEK_END ); 
	size = _ftell( str );
	_fseek( str, 0, SEEK_SET );
	Pos = 0;
	this->autoFree = autoFree;
}
예제 #5
0
//Creating file outside of the cache
bool FileStream::Create(const char *path)
{
	Close();

	ExtractFileFromPath( filename, path );
	strlcpy(originalfile, path, _MAX_PATH);

	if (!str->OpenNew(originalfile)) {
		return false;
	}
	opened = true;
	created = true;
	Pos = 0;
	size = 0;
	return true;
}
예제 #6
0
bool FileStream::Modify(const char* fname)
{
	Close();

	if (!str->OpenRW(fname)) {
		return false;
	}
#ifdef _DEBUG
	FileStreamPtrCount++;
#endif
	opened = true;
	created = true;
	FindLength();
	ExtractFileFromPath( filename, fname );
	strlcpy( originalfile, fname, _MAX_PATH);
	Pos = 0;
	return true;
}
예제 #7
0
bool FileStream::Open(const char* fname)
{
	Close();

	if (!file_exists(fname)) {
		return false;
	}

	if (!str->OpenRO(fname)) {
		return false;
	}
#ifdef _DEBUG
	core->FileStreamPtrCount++;
#endif
	opened = true;
	created = false;
	FindLength();
	ExtractFileFromPath( filename, fname );
	strncpy( originalfile, fname, _MAX_PATH);
	return true;
}
예제 #8
0
DataStream* ResourceManager::AddCacheFile(const char *filename)
{
	if (!core->GameOnCD)
		return FileStream::OpenFile(filename);

	char fname[_MAX_PATH];
	ExtractFileFromPath(fname, filename);

	FileStream *dest = OpenCacheFile(fname);

	// already in cache
	if (dest)
		return dest;

	FileStream* src = FileStream::OpenFile(fname);
	dest = CreateCacheFile(fname);

	if (!src || !dest) {
		printMessage("ResourceManager", "Failed to copy file '%s'\n", RED, fname);
		abort();
	}

	size_t blockSize = 1024 * 1000;
	char buff[1024 * 1000];
	do {
		if (blockSize > src->Remains())
			blockSize = src->Remains();
		size_t len = src->Read(buff, blockSize);
		size_t c = dest->Write(buff, len);
		if (c != len) {
			printMessage("ResourceManager", "Failed to write to file '%s'\n", RED, fname);
			abort();
		}
	} while (src->Remains());

	delete src;
	delete dest;

	return OpenCacheFile(fname);
}
예제 #9
0
DataStream *ResourceManager::AddCompressedCacheFile(DataStream *stream, const char* filename, int length, bool overwrite)
{
	if (!core->IsAvailable(PLUGIN_COMPRESSION_ZLIB)) {
		printMessage("ResourceManager", "No compression manager available.\nCannot load compressed file.\n", RED);
		return NULL;
	}

	char fname[_MAX_PATH];
	ExtractFileFromPath(fname, filename);

	FileStream *str = NULL;

	if (!overwrite)
		str = OpenCacheFile(fname);

	if (!str) {
		FileStream *out = CreateCacheFile(fname);

		if (!out) {
			printMessage("ResourceManager", "Failed to write to file '%s'.\n", RED, fname);
			return NULL;
		}

		PluginHolder<Compressor> comp(PLUGIN_COMPRESSION_ZLIB);
		if (comp->Decompress(out, stream, length) != GEM_OK) {
			delete out;
			return NULL;
		}

		delete out;
	} else {
		stream->Seek(length, GEM_CURRENT_POS);
	}

	delete str;

	return OpenCacheFile(fname);
}