Subversion Repositories spk

Rev

Rev 51 | Rev 53 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 51 Rev 52
Line 1026... Line 1026...
1026
			CyString tofile = pCheckFile->GetFilePointer().GetToken("::", 2, 2);
1026
			CyString tofile = pCheckFile->GetFilePointer().GetToken("::", 2, 2);
1027
 
1027
 
1028
			CCatFile tocat;
1028
			CCatFile tocat;
1029
			int err = tocat.Open ( fit->GetFilePointer().GetToken("::", 1, 1), "", CATREAD_CATDECRYPT, true );
1029
			int err = tocat.Open ( fit->GetFilePointer().GetToken("::", 1, 1), "", CATREAD_CATDECRYPT, true );
1030
			if ( (err == CATERR_NONE) || (err == CATERR_CREATED) ) {
1030
			if ( (err == CATERR_NONE) || (err == CATERR_CREATED) ) {
1031
				tocat.AppendFile ( pCheckFile->GetFilePointer(), tofile );
1031
				tocat.AppendFile(pCheckFile->GetFilePointer().ToString(), tofile.ToString());
1032
				CLog::logf(CLog::Log_Install, 2, "Adding existing file into new mod File, %s => %s", fit->GetFilePointer().GetToken("::", 1, 1).c_str(), tofile.c_str());
1032
				CLog::logf(CLog::Log_Install, 2, "Adding existing file into new mod File, %s => %s", fit->GetFilePointer().GetToken("::", 1, 1).c_str(), tofile.c_str());
1033
			}
1033
			}
1034
 
1034
 
1035
			CCatFile fromcat;
1035
			CCatFile fromcat;
1036
			err = fromcat.Open ( pCheckFile->GetFilePointer().GetToken("::", 1, 1), "", CATREAD_CATDECRYPT, false );
1036
			err = fromcat.Open ( pCheckFile->GetFilePointer().GetToken("::", 1, 1), "", CATREAD_CATDECRYPT, false );
Line 1054... Line 1054...
1054
				}
1054
				}
1055
				if ( errorStr )	errorStr->PushBack(to, ERRORLOG(SPKINSTALL_CREATEDIRECTORY));
1055
				if ( errorStr )	errorStr->PushBack(to, ERRORLOG(SPKINSTALL_CREATEDIRECTORY));
1056
			}
1056
			}
1057
 
1057
 
1058
			CyString destfile = CyString(sDestination) + "/" + pCheckFile->GetNameDirectory(this);
1058
			CyString destfile = CyString(sDestination) + "/" + pCheckFile->GetNameDirectory(this);
1059
			if ( CFileIO(destfile).Exists() ) CFileIO(destfile).Remove();
1059
			if ( CFileIO(destfile).ExistsOld() ) CFileIO::Remove(destfile.ToString());
1060
			CLog::logf(CLog::Log_Install, 1, "Adjusting existing filename, %s => %s", pCheckFile->GetFilePointer().c_str(), destfile.c_str());
1060
			CLog::logf(CLog::Log_Install, 1, "Adjusting existing filename, %s => %s", pCheckFile->GetFilePointer().c_str(), destfile.c_str());
1061
			rename ( pCheckFile->GetFilePointer().c_str(), destfile.c_str() );
1061
			rename ( pCheckFile->GetFilePointer().c_str(), destfile.c_str() );
1062
			pCheckFile->SetFilename ( CyString(sDestination) + "/" + pCheckFile->GetNameDirectory(this) );
1062
			pCheckFile->SetFilename ( CyString(sDestination) + "/" + pCheckFile->GetNameDirectory(this) );
1063
		}
1063
		}
1064
		pCheckFile->SetDisabled(false);
1064
		pCheckFile->SetDisabled(false);
Line 1196... Line 1196...
1196
				{
1196
				{
1197
					//TODO: check what this is actually doing
1197
					//TODO: check what this is actually doing
1198
					if ( !cFile->GetUsed() )
1198
					if ( !cFile->GetUsed() )
1199
					{
1199
					{
1200
						CFileIO rFile(cFile->GetFilePointer());
1200
						CFileIO rFile(cFile->GetFilePointer());
1201
						if ( rFile.Exists() )
1201
						if ( rFile.exists() )
1202
						{
1202
						{
1203
							if ( errorStr )
1203
							if ( errorStr )
1204
							{
1204
							{
1205
								if ( rFile.Remove() )
1205
								if ( rFile.remove() )
1206
									errorStr->PushBack(cFile->GetFilePointer().Remove(destdir), ERRORLOG(SPKINSTALL_DELETEFILE));
1206
									errorStr->PushBack(cFile->GetFilePointer().Remove(destdir), ERRORLOG(SPKINSTALL_DELETEFILE));
1207
								else
1207
								else
1208
									errorStr->PushBack(cFile->GetFilePointer().Remove(destdir), ERRORLOG(SPKINSTALL_DELETEFILE_FAIL));
1208
									errorStr->PushBack(cFile->GetFilePointer().Remove(destdir), ERRORLOG(SPKINSTALL_DELETEFILE_FAIL));
1209
							}
1209
							}
1210
						}
1210
						}
Line 1851... Line 1851...
1851
	Input:  filename - The filename of the spk file to write to
1851
	Input:  filename - The filename of the spk file to write to
1852
	Desc:   Writes the data to an spk file
1852
	Desc:   Writes the data to an spk file
1853
*/
1853
*/
1854
bool CBaseFile::WriteFile ( CyString filename, CProgressInfo *progress )
1854
bool CBaseFile::WriteFile ( CyString filename, CProgressInfo *progress )
1855
{
1855
{
1856
	FILE *id = fopen ( filename.c_str(), "wb" );
-
 
1857
	if ( !id )
-
 
1858
		return false;
1856
	CFileIO File(filename);
1859
 
-
 
1860
	bool ret = WriteData ( id, progress );
1857
	if ( File.startWrite() ) return WriteData(File, progress);
1861
	fclose ( id );
-
 
1862
 
-
 
1863
	return ret;
1858
	return false;
1864
}
1859
}
1865
 
1860
 
1866
bool CBaseFile::WriteHeader(FILE *id, int valueheader, int valueComprLen)
1861
bool CBaseFile::WriteHeader(CFileIO &file, int valueheader, int valueComprLen)
1867
{
1862
{
1868
	fprintf ( id, "BaseCycrow;%.2f;%d;%d\n", FILEVERSION, valueheader, valueComprLen );
1863
	return file.write("BaseCycrow;%.2f;%d;%d\n", FILEVERSION, valueheader, valueComprLen);
1869
	if ( ferror(id) )
-
 
1870
		return false;
-
 
1871
	return true;
-
 
1872
}
1864
}
1873
 
1865
 
1874
bool CBaseFile::WriteData ( FILE *id, CProgressInfo *progress )
1866
bool CBaseFile::WriteData(CFileIO &file, CProgressInfo *progress )
1875
{
1867
{
1876
	int valueheader = m_SHeader.iValueCompression, fileheader = m_SHeader.iValueCompression;
1868
	int valueheader = m_SHeader.iValueCompression, fileheader = m_SHeader.iValueCompression;
1877
	if ( valueheader == SPKCOMPRESS_7ZIP )
1869
	if ( valueheader == SPKCOMPRESS_7ZIP )
1878
		valueheader = SPKCOMPRESS_ZLIB;
1870
		valueheader = SPKCOMPRESS_ZLIB;
1879
	if ( fileheader == SPKCOMPRESS_7ZIP )
1871
	if ( fileheader == SPKCOMPRESS_7ZIP )
Line 1909... Line 1901...
1909
		memcpy ( valueCompr, values.c_str(), valueComprLen );
1901
		memcpy ( valueCompr, values.c_str(), valueComprLen );
1910
		valueheader = SPKCOMPRESS_NONE;
1902
		valueheader = SPKCOMPRESS_NONE;
1911
	}
1903
	}
1912
 
1904
 
1913
	// write the main header to the file
1905
	// write the main header to the file
1914
	if ( !this->WriteHeader(id, valueheader, valueComprLen) )
1906
	if ( !this->WriteHeader(file, valueheader, valueComprLen) )	return false;
1915
		return false;
-
 
1916
 
1907
 
1917
	// write the compressed data to file
1908
	// write the compressed data to file
1918
	fputc ( (unsigned char)(valueUncomprLen >> 24), id );
1909
	file.put(static_cast<unsigned char>(valueUncomprLen >> 24));
1919
	fputc ( (unsigned char)(valueUncomprLen >> 16), id );
1910
	file.put(static_cast<unsigned char>(valueUncomprLen >> 16));
1920
	fputc ( (unsigned char)(valueUncomprLen >> 8), id );
1911
	file.put(static_cast<unsigned char>(valueUncomprLen >> 8));
1921
	fputc ( (unsigned char)valueUncomprLen, id );
1912
	file.put(static_cast<unsigned char>(valueUncomprLen));
1922
	fwrite ( valueCompr, sizeof(char), valueComprLen, id );
1913
	file.write(valueCompr, valueComprLen);
1923
 
-
 
1924
	free ( valueCompr );
1914
	free ( valueCompr );
1925
 
1915
 
1926
	// now compress the files header
1916
	// now compress the files header
1927
	// create the files values
1917
	// create the files values
1928
	CyString files = CreateFilesLine ( true, progress );
1918
	CyString files = CreateFilesLine ( true, progress );
Line 1956... Line 1946...
1956
		fileheader = SPKCOMPRESS_NONE;
1946
		fileheader = SPKCOMPRESS_NONE;
1957
	}
1947
	}
1958
 
1948
 
1959
	// now write the file header
1949
	// now write the file header
1960
	m_SHeader2.lSize = fileComprLen;
1950
	m_SHeader2.lSize = fileComprLen;
1961
	fprintf ( id, "FileHeader;%d;%ld;%ld;%d;%d\n", m_SHeader2.iNumFiles, m_SHeader2.lSize, m_SHeader2.lFullSize, fileheader, m_SHeader2.iDataCompression );
1951
	file.write("FileHeader;%d;%ld;%ld;%d;%d\n", m_SHeader2.iNumFiles, m_SHeader2.lSize, m_SHeader2.lFullSize, fileheader, m_SHeader2.iDataCompression);
1962
 
-
 
1963
	fputc ( (unsigned char)(fileUncomprLen >> 24), id );
-
 
1964
	fputc ( (unsigned char)(fileUncomprLen >> 16), id );
-
 
1965
	fputc ( (unsigned char)(fileUncomprLen >> 8), id );
-
 
1966
	fputc ( (unsigned char)fileUncomprLen, id );
-
 
1967
	fwrite ( fileCompr, sizeof(char), fileComprLen, id );
-
 
1968
 
1952
 
-
 
1953
	file.put(static_cast<unsigned char>(fileUncomprLen >> 24));
-
 
1954
	file.put(static_cast<unsigned char>(fileUncomprLen >> 16));
-
 
1955
	file.put(static_cast<unsigned char>(fileUncomprLen >> 8));
-
 
1956
	file.put(static_cast<unsigned char>(fileUncomprLen));
-
 
1957
	file.write(fileCompr, fileComprLen);
1969
	free ( fileCompr );
1958
	free ( fileCompr );
1970
 
1959
 
1971
	if ( progress )
1960
	if ( progress )
1972
	{
1961
	{
1973
		progress->UpdateStatus(STATUS_WRITE);
1962
		progress->UpdateStatus(STATUS_WRITE);
Line 1979... Line 1968...
1979
			max += m_pIconFile->GetDataSize();
1968
			max += m_pIconFile->GetDataSize();
1980
		progress->SetMax(max);
1969
		progress->SetMax(max);
1981
	}
1970
	}
1982
 
1971
 
1983
	// now finally, write all the file data
1972
	// now finally, write all the file data
1984
	if ( m_pIconFile )
1973
	if ( m_pIconFile ) {
1985
	{
-
 
1986
		if ( progress )
-
 
1987
			progress->UpdateFile(m_pIconFile);
1974
		if ( progress )	progress->UpdateFile(m_pIconFile);
1988
		fputc ( (unsigned char)(m_pIconFile->GetUncompressedDataSize() >> 24), id );
-
 
1989
		fputc ( (unsigned char)(m_pIconFile->GetUncompressedDataSize() >> 16), id );
-
 
1990
		fputc ( (unsigned char)(m_pIconFile->GetUncompressedDataSize() >> 8), id );
-
 
1991
		fputc ( (unsigned char)m_pIconFile->GetUncompressedDataSize(), id );
1975
		file.writeSize(m_pIconFile->GetUncompressedDataSize());
1992
		fwrite ( m_pIconFile->GetData(), sizeof(char), m_pIconFile->GetDataSize(), id );
1976
		file.write(m_pIconFile->GetData(), m_pIconFile->GetDataSize());
1993
		if ( progress )
-
 
1994
			progress->IncDone(m_pIconFile->GetDataSize());
1977
		if ( progress )	progress->IncDone(m_pIconFile->GetDataSize());
1995
	}
1978
	}
1996
 
1979
 
1997
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
1980
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
1998
	{
1981
	{
1999
		C_File *file = node->Data();
1982
		C_File *f = node->Data();
2000
		if ( progress )
-
 
2001
			progress->UpdateFile(file);
1983
		if ( progress )	progress->UpdateFile(f);
2002
		fputc ( (unsigned char)(file->GetUncompressedDataSize() >> 24), id );
-
 
2003
		fputc ( (unsigned char)(file->GetUncompressedDataSize() >> 16), id );
-
 
2004
		fputc ( (unsigned char)(file->GetUncompressedDataSize() >> 8), id );
-
 
2005
		fputc ( (unsigned char)file->GetUncompressedDataSize(), id );
1984
		file.writeSize(f->GetUncompressedDataSize());
2006
		unsigned char *data = file->GetData();
1985
		unsigned char *data = f->GetData();
2007
		size_t remaining = file->GetDataSize();
1986
		size_t remaining = f->GetDataSize();
2008
		while ( remaining )
1987
		while ( remaining )	{
2009
		{
-
 
2010
			size_t writeSize = WRITECHUNK;
1988
			size_t writeSize = WRITECHUNK;
2011
			if ( writeSize > remaining )
1989
			if ( writeSize > remaining ) writeSize = remaining;
2012
				writeSize = remaining;
-
 
2013
 
1990
 
2014
			size_t written = fwrite ( data, sizeof(char), writeSize, id );
1991
			if ( file.write(data, writeSize) ) {
2015
			data += written;
1992
				data += writeSize;
2016
			remaining -= written;
1993
				remaining -= writeSize;
-
 
1994
			}
2017
 
1995
 
2018
			if ( progress )
-
 
2019
				progress->IncDone((int)written);
1996
			if ( progress ) progress->IncDone((int)writeSize);
2020
		}
1997
		}
2021
 
-
 
2022
	}
1998
	}
2023
 
1999
 
2024
	_changed();
2000
	_changed();
2025
 
2001
 
2026
	return true;
2002
	return true;
2027
}
2003
}
2028
 
2004
 
2029
 
2005
 
2030
 
-
 
2031
 
-
 
2032
 
-
 
2033
bool CBaseFile::ExtractFile ( C_File *file, CyString dir, bool includedir, CProgressInfo *progress )
2006
bool CBaseFile::ExtractFile ( C_File *file, CyString dir, bool includedir, CProgressInfo *progress )
2034
{
2007
{
2035
	if ( ReadFileToMemory ( file ) )
2008
	if ( ReadFileToMemory ( file ) )
2036
	{
2009
	{
2037
		// now finally, uncompress the file
2010
		// now finally, uncompress the file
Line 2079... Line 2052...
2079
	// no file to read from
2052
	// no file to read from
2080
	if ( this->filename().empty() )
2053
	if ( this->filename().empty() )
2081
		return false;
2054
		return false;
2082
 
2055
 
2083
	// now open the file
2056
	// now open the file
2084
	FILE *id = fopen ( this->filename().c_str(), "rb" );
2057
	CFileIO File(this->filename());
2085
	if ( !id )
-
 
2086
		return false;
2058
	if ( !File.StartRead() ) return false;
2087
 
2059
 
2088
	fseek ( id, 0, SEEK_SET );
-
 
2089
	// read the header
2060
	// read the header
2090
	GetEndOfLine ( id, NULL, false );
2061
	File.readEndOfLine();
2091
	// skip past values
2062
	// skip past values
2092
	fseek ( id, m_SHeader.lValueCompressSize, SEEK_CUR );
2063
	File.seek(m_SHeader.lValueCompressSize);
2093
 
2064
 
2094
	// read the next header
2065
	// read the next header
2095
	GetEndOfLine ( id, NULL, false );
2066
	File.readEndOfLine();
2096
	// skip past files
2067
	// skip past files
2097
	fseek ( id, 4, SEEK_CUR );
-
 
2098
	fseek ( id, m_SHeader2.lSize, SEEK_CUR );
2068
	File.seek(4 + m_SHeader2.lSize);
2099
 
2069
 
2100
	// now were in the file section
2070
	// now were in the file section
2101
	// skip past each one
2071
	// skip past each one
2102
	if ( m_pIconFile )
-
 
2103
	{
-
 
2104
		fseek ( id, 4, SEEK_CUR );
-
 
2105
		fseek ( id, m_pIconFile->GetDataSize (), SEEK_CUR );
2072
	if ( m_pIconFile ) File.seek(4 + m_pIconFile->GetDataSize ());
2106
	}
-
 
2107
 
2073
 
2108
	CDirIO Dir(dir);
2074
	CDirIO Dir(dir);
2109
 
2075
 
2110
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
2076
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() ) {
2111
	{
-
 
2112
		C_File *fit = node->Data();
2077
		C_File *fit = node->Data();
2113
 
2078
 
2114
		if ( progress )
-
 
2115
			progress->UpdateFile ( fit );
2079
		if ( progress )	progress->UpdateFile ( fit );
2116
 
2080
 
2117
		if ( (!fit->GetDataSize ()) || (!fit->GetData()) )
2081
		if ( (!fit->GetDataSize ()) || (!fit->GetData()) ) {
2118
		{
-
 
2119
			if ( !fit->ReadFromFile ( id, fit->GetDataSize() ) )
2082
			if ( !fit->readFromFile(File, fit->GetDataSize()) ) return false;
2120
			{
-
 
2121
				fclose ( id );
-
 
2122
				return false;
-
 
2123
			}
-
 
2124
		}
2083
		}
2125
		else
2084
		else
2126
			fseek ( id, fit->GetDataSize(), SEEK_CUR );
2085
			File.seek(fit->GetDataSize());
2127
 
2086
 
2128
		if ( game ) {
2087
		if ( game ) {
2129
			if ( fit->GetGame() && fit->GetGame() != game )
2088
			if ( fit->GetGame() && fit->GetGame() != game )
2130
				continue;
2089
				continue;
2131
		}
2090
		}
Line 2133... Line 2092...
2133
		// create directory first
2092
		// create directory first
2134
		Dir.Create(fit->GetDirectory(this));
2093
		Dir.Create(fit->GetDirectory(this));
2135
 
2094
 
2136
		long size = 0;
2095
		long size = 0;
2137
		unsigned char *data = fit->UncompressData (&size, progress);
2096
		unsigned char *data = fit->UncompressData (&size, progress);
2138
		if ( (!data) && (fit->GetCompressionType() == SPKCOMPRESS_7ZIP) )
2097
		if ( (!data) && (fit->GetCompressionType() == SPKCOMPRESS_7ZIP) ) {
2139
		{
-
 
2140
			if ( !fit->UncompressToFile ( dir, this, includedir, progress ) )
2098
			if ( !fit->UncompressToFile ( dir, this, includedir, progress ) ) return false;
2141
			{
-
 
2142
				fclose ( id );
-
 
2143
				return false;
-
 
2144
			}
-
 
2145
		}
-
 
2146
		else if ( (!data) || (!fit->WriteToDir ( dir, this, includedir, NullString, data, size )) )
-
 
2147
		{
-
 
2148
			fclose ( id );
-
 
2149
			return false;
-
 
2150
		}
2099
		}
-
 
2100
		else if ( (!data) || (!fit->WriteToDir ( dir, this, includedir, NullString, data, size )) ) return false;
2151
	}
2101
	}
2152
 
2102
 
2153
	fclose ( id );
2103
	File.close();
2154
 
-
 
2155
	return true;
2104
	return true;
2156
}
2105
}
2157
 
2106
 
2158
 
2107
 
2159
 
2108
 
Line 2772... Line 2721...
2772
}
2721
}
2773
 
2722
 
2774
 
2723
 
2775
CyString CBaseFile::GetFullFileSizeString() { return SPK::GetSizeString ( this->GetFullFileSize() ); }
2724
CyString CBaseFile::GetFullFileSizeString() { return SPK::GetSizeString ( this->GetFullFileSize() ); }
2776
 
2725
 
-
 
2726
// used for a multiple spk file
2777
unsigned char *CBaseFile::CreateData(size_t *size, CProgressInfo *progress)
2727
unsigned char *CBaseFile::CreateData(size_t *size, CProgressInfo *progress)
2778
{
2728
{
2779
	if ( this->WriteFile("temp.dat", progress) )
2729
	if ( this->WriteFile("temp.dat", progress) ) {
2780
	{
-
 
2781
		FILE *id = fopen("temp.dat", "rb");
2730
		CFileIO File("temp.dat");
2782
		if ( id )
-
 
2783
		{
-
 
2784
			fseek(id, 0, SEEK_END);
2731
		File.setAutoDelete(true);
2785
			*size = ftell(id);
2732
		return File.readAll(size);
2786
			fseek(id, 0, SEEK_SET);
-
 
2787
			unsigned char *data = new unsigned char[*size];
-
 
2788
			fread(data, sizeof(unsigned char), *size, id);
-
 
2789
			fclose(id);
-
 
2790
 
-
 
2791
			remove("temp.dat");
-
 
2792
			return data;
-
 
2793
		}
-
 
2794
	}
2733
	}
2795
 
-
 
2796
	remove("temp.dat");
-
 
2797
	return NULL;
2734
	return NULL;
2798
}
2735
}
2799
 
2736
 
2800
 
2737
 
2801
void CBaseFile::ConvertNormalMod(C_File *f, CyString to)
2738
void CBaseFile::ConvertNormalMod(C_File *f, CyString to)
Line 3005... Line 2942...
3005
	if ( this->GeneratePackagerScript(false, &list, true) )
2942
	if ( this->GeneratePackagerScript(false, &list, true) )
3006
	{
2943
	{
3007
		if ( CFileIO("test.tmp").WriteFile(&list) )
2944
		if ( CFileIO("test.tmp").WriteFile(&list) )
3008
		{
2945
		{
3009
			ZipAdd(hz, L"pluginmanager.txt", L"test.tmp");
2946
			ZipAdd(hz, L"pluginmanager.txt", L"test.tmp");
3010
			CFileIO("test.tmp").Remove();
2947
			CFileIO::Remove("test.tmp");
3011
		}
2948
		}
3012
	}
2949
	}
3013
 
2950
 
3014
	CloseZip(hz);
2951
	CloseZip(hz);
3015
 
2952