|  | @@ -94,6 +94,27 @@ void CSndHandler::extract(std::string srcfile, std::string dstfile, bool caseSen
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +MemberFile CSndHandler::getFile(std::string name)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	MemberFile ret;	
 | 
	
		
			
				|  |  | +	std::transform(name.begin(),name.end(),name.begin(),tolower);
 | 
	
		
			
				|  |  | +	for (int i=0;i<entries.size();i++)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		if (entries[i].name==name)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			std::string por = entries[i].name;
 | 
	
		
			
				|  |  | +			std::transform(por.begin(),por.end(),por.begin(),tolower);
 | 
	
		
			
				|  |  | +			if (por==name)
 | 
	
		
			
				|  |  | +			{
 | 
	
		
			
				|  |  | +				ret.length=entries[i].size;
 | 
	
		
			
				|  |  | +				file.seekg(entries[i].offset,std::ios_base::beg);
 | 
	
		
			
				|  |  | +				ret.ifs=&file;
 | 
	
		
			
				|  |  | +				return ret;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return ret;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  unsigned char * CSndHandler::extract (int index, int & size)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  	size = entries[index].size;
 | 
	
	
		
			
				|  | @@ -101,4 +122,119 @@ unsigned char * CSndHandler::extract (int index, int & size)
 | 
	
		
			
				|  |  |  	file.seekg(entries[index].offset,std::ios_base::beg);
 | 
	
		
			
				|  |  |  	file.read((char*)ret,entries[index].size);
 | 
	
		
			
				|  |  |  	return ret;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +CVidHandler::~CVidHandler()
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	entries.clear();
 | 
	
		
			
				|  |  | +	file.close();
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +CVidHandler::CVidHandler(std::string fname):CHUNK(65535)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	file.open(fname.c_str(),std::ios::binary);
 | 
	
		
			
				|  |  | +	if (!file.is_open())
 | 
	
		
			
				|  |  | +		throw new std::exception((std::string("Cannot open ")+fname).c_str());
 | 
	
		
			
				|  |  | +	int nr = readNormalNr(0,4);
 | 
	
		
			
				|  |  | +	char tempc;
 | 
	
		
			
				|  |  | +	for (int i=0;i<nr;i++)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		Entry entry;
 | 
	
		
			
				|  |  | +		while(true)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			file.read(&tempc,1);
 | 
	
		
			
				|  |  | +			if (tempc)
 | 
	
		
			
				|  |  | +				entry.name+=tempc;
 | 
	
		
			
				|  |  | +			else break;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		entry.something=readNormalNr(-1,4);
 | 
	
		
			
				|  |  | +		file.seekg(44-entry.name.length()-9,std::ios_base::cur);
 | 
	
		
			
				|  |  | +		entry.offset = readNormalNr(-1,4);
 | 
	
		
			
				|  |  | +		if (i>0)
 | 
	
		
			
				|  |  | +			entries[i-1].size=entry.offset-entries[i-1].offset;
 | 
	
		
			
				|  |  | +		if (i==nr-1)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			file.seekg(0,std::ios::end); 
 | 
	
		
			
				|  |  | +			entry.size = ((int)file.tellg())-entry.offset;
 | 
	
		
			
				|  |  | +			file.seekg(0,std::ios::beg); 
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		entries.push_back(entry);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +int CVidHandler::readNormalNr (int pos, int bytCon)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	if (pos>=0)
 | 
	
		
			
				|  |  | +		file.seekg(pos,std::ios_base::beg);
 | 
	
		
			
				|  |  | +	int ret=0;
 | 
	
		
			
				|  |  | +	int amp=1;
 | 
	
		
			
				|  |  | +	unsigned char zcz=0;
 | 
	
		
			
				|  |  | +	for (int i=0; i<bytCon; i++)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		file.read((char*)(&zcz),1);
 | 
	
		
			
				|  |  | +		ret+=zcz*amp;
 | 
	
		
			
				|  |  | +		amp*=256;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return ret;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +void CVidHandler::extract(int index, std::string dstfile) //saves selected file
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	std::ofstream out(dstfile.c_str(),std::ios_base::binary);
 | 
	
		
			
				|  |  | +	file.seekg(entries[index].offset,std::ios_base::beg);
 | 
	
		
			
				|  |  | +	int toRead=entries[index].size;
 | 
	
		
			
				|  |  | +	char * buffer = new char[std::min(CHUNK,entries[index].size)];
 | 
	
		
			
				|  |  | +	while (toRead>CHUNK)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		file.read(buffer,CHUNK);
 | 
	
		
			
				|  |  | +		out.write(buffer,CHUNK);
 | 
	
		
			
				|  |  | +		toRead-=CHUNK;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	file.read(buffer,toRead);
 | 
	
		
			
				|  |  | +	out.write(buffer,toRead);
 | 
	
		
			
				|  |  | +	out.close();
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +void CVidHandler::extract(std::string srcfile, std::string dstfile, bool caseSens) //saves selected file
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	if (caseSens)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		for (int i=0;i<entries.size();i++)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			if (entries[i].name==srcfile)
 | 
	
		
			
				|  |  | +				extract(i,dstfile);
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	else
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		std::transform(srcfile.begin(),srcfile.end(),srcfile.begin(),tolower);
 | 
	
		
			
				|  |  | +		for (int i=0;i<entries.size();i++)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			if (entries[i].name==srcfile)
 | 
	
		
			
				|  |  | +			{
 | 
	
		
			
				|  |  | +				std::string por = entries[i].name;
 | 
	
		
			
				|  |  | +				std::transform(por.begin(),por.end(),por.begin(),tolower);
 | 
	
		
			
				|  |  | +				if (por==srcfile)
 | 
	
		
			
				|  |  | +					extract(i,dstfile);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +MemberFile CVidHandler::getFile(std::string name)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	MemberFile ret;	
 | 
	
		
			
				|  |  | +	std::transform(name.begin(),name.end(),name.begin(),tolower);
 | 
	
		
			
				|  |  | +	for (int i=0;i<entries.size();i++)
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		if (entries[i].name==name)
 | 
	
		
			
				|  |  | +		{
 | 
	
		
			
				|  |  | +			std::string por = entries[i].name;
 | 
	
		
			
				|  |  | +			std::transform(por.begin(),por.end(),por.begin(),tolower);
 | 
	
		
			
				|  |  | +			if (por==name)
 | 
	
		
			
				|  |  | +			{
 | 
	
		
			
				|  |  | +				ret.length=entries[i].size;
 | 
	
		
			
				|  |  | +				file.seekg(entries[i].offset,std::ios_base::beg);
 | 
	
		
			
				|  |  | +				ret.ifs=&file;
 | 
	
		
			
				|  |  | +				return ret;
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return ret;
 | 
	
		
			
				|  |  | +}
 |