Subversion Repositories spk

Rev

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

Rev 52 Rev 56
Line 147... Line 147...
147
		return false;
147
		return false;
148
	}
148
	}
149
	else if ( check != SPKFILE_SINGLE && check != SPKFILE_SINGLESHIP )
149
	else if ( check != SPKFILE_SINGLE && check != SPKFILE_SINGLESHIP )
150
		return false;
150
		return false;
151
 
151
 
152
	FILE *id = fopen ( file.c_str(), "rb" );
-
 
153
	if ( !id )
152
	CFileIO File(file);
154
		return false;
153
	if ( !File.startRead() ) return false;
155
 
154
 
156
	// create entry
155
	// create entry
157
	SMultiSpkFile *ms = new SMultiSpkFile;
156
	SMultiSpkFile *ms = new SMultiSpkFile;
158
	ms->bRemove = false;
157
	ms->bRemove = false;
159
	ms->pFile = NULL;
158
	ms->pFile = NULL;
160
	ms->sName = file;
159
	ms->sName = file;
161
	ms->sName = ms->sName.FindReplace ( "\\", "/" );
160
	ms->sName = ms->sName.FindReplace ( "\\", "/" );
162
	ms->sName = ms->sName.GetToken ( ms->sName.NumToken('/'), '/' );
161
	ms->sName = ms->sName.GetToken ( ms->sName.NumToken('/'), '/' );
163
	ms->bOn = on;
162
	ms->bOn = on;
164
 
-
 
165
	// find file size
-
 
166
	fseek ( id, 0, SEEK_END );
-
 
167
	ms->lSize = ftell ( id );
-
 
168
	fseek ( id, 0, SEEK_SET );
-
 
169
 
163
 
170
	// read data
164
	// read data
171
	ms->sData = new char[ms->lSize];
165
	ms->sData = (char *)File.readAll((size_t *)&ms->lSize);
172
	fread ( ms->sData, sizeof(char), ms->lSize, id );
-
 
173
 
-
 
174
	fclose ( id );
166
	File.close();
175
 
167
 
176
	CBaseFile *baseFile = NULL;
168
	CBaseFile *baseFile = NULL;
177
	if ( check == SPKFILE_SINGLE )
169
	if ( check == SPKFILE_SINGLE )
178
		baseFile = new CSpkFile;
170
		baseFile = new CSpkFile;
179
	else if ( check == SPKFILE_SINGLESHIP )
171
	else if ( check == SPKFILE_SINGLESHIP )
180
		baseFile = new CXspFile;
172
		baseFile = new CXspFile;
181
 
173
 
182
	if ( baseFile )
174
	if ( baseFile ) {
183
	{
-
 
184
		if ( baseFile->ReadFile(file, SPKREAD_VALUES) )
175
		if ( baseFile->ReadFile(file, SPKREAD_VALUES) )	{
185
		{
-
 
186
			ms->sScriptAuthor	= baseFile->author();
176
			ms->sScriptAuthor	= baseFile->author();
187
			ms->sScriptName		= baseFile->name();
177
			ms->sScriptName		= baseFile->name();
188
			ms->sScriptVersion	= baseFile->version();
178
			ms->sScriptVersion	= baseFile->version();
189
			ms->iType			= baseFile->GetType();
179
			ms->iType			= baseFile->GetType();
190
		}
180
		}
Line 300... Line 290...
300
 
290
 
301
	return true;
291
	return true;
302
}
292
}
303
 
293
 
304
bool CMultiSpkFile::ParseHeader ( CyString header )
294
bool CMultiSpkFile::ParseHeader ( CyString header )
305
{
295
{
306
	if ( header.GetToken ( 1, ';' ) != "MSPKCycrow" )
296
	if ( header.GetToken ( 1, ';' ) != "MSPKCycrow" )
307
		return false;
297
		return false;
308
 
298
 
309
	m_SHeader.fVersion = header.GetToken ( 2, ';' ).ToFloat();
299
	m_SHeader.fVersion = header.GetToken ( 2, ';' ).ToFloat();
310
	if ( m_SHeader.fVersion > FILEVERSION )
300
	if ( m_SHeader.fVersion > FILEVERSION )
Line 312... Line 302...
312
 
302
 
313
	m_SHeader.iCompression = header.GetToken ( 3, ';' ).ToInt();
303
	m_SHeader.iCompression = header.GetToken ( 3, ';' ).ToInt();
314
	m_SHeader.lUncomprLen = header.GetToken ( 4, ';' ).ToLong();
304
	m_SHeader.lUncomprLen = header.GetToken ( 4, ';' ).ToLong();
315
	m_SHeader.lComprLen = header.GetToken ( 5, ';' ).ToLong();
305
	m_SHeader.lComprLen = header.GetToken ( 5, ';' ).ToLong();
316
	m_SHeader.bSelection = (header.GetToken ( 4, ';' ).ToInt()) ? true : false;
306
	m_SHeader.bSelection = (header.GetToken ( 4, ';' ).ToInt()) ? true : false;
317
 
307
 
318
	return true;
308
	return true;
319
}
309
}
320
 
310
 
321
bool CMultiSpkFile::ParseValueLine ( CyString line )
311
bool CMultiSpkFile::ParseValueLine ( CyString line )
322
{
312
{
Line 333... Line 323...
333
		ms->bOn = (rest.GetToken ( 1, ':' ).ToInt()) ? true : false;
323
		ms->bOn = (rest.GetToken ( 1, ':' ).ToInt()) ? true : false;
334
		ms->lSize = rest.GetToken ( 2, ':' ).ToLong();
324
		ms->lSize = rest.GetToken ( 2, ':' ).ToLong();
335
		ms->sName = rest.GetToken ( 3, ':' );
325
		ms->sName = rest.GetToken ( 3, ':' );
336
		ms->sData = NULL;
326
		ms->sData = NULL;
337
		ms->iType = TYPE_SPK;
327
		ms->iType = TYPE_SPK;
338
		CyString r = rest.GetToken ( 4, -1, ':' );
328
		CyString r = rest.GetToken ( 4, -1, ':' );
339
		if ( !r.Empty() )
329
		if ( !r.Empty() )
340
		{
330
		{
341
			ms->sScriptName = r.GetToken ( 1, '|' );
331
			ms->sScriptName = r.GetToken ( 1, '|' );
342
			ms->sScriptAuthor = r.GetToken ( 2, '|' );
332
			ms->sScriptAuthor = r.GetToken ( 2, '|' );
343
			ms->sScriptVersion = r.GetToken ( 3, -1, '|' );
333
			ms->sScriptVersion = r.GetToken ( 3, -1, '|' );
344
		}
334
		}
345
		m_lFiles.push_back ( ms );
335
		m_lFiles.push_back ( ms );
Line 404... Line 394...
404
	int num = 0;
394
	int num = 0;
405
	CyString *lines = values.SplitToken ( '\n', &num );
395
	CyString *lines = values.SplitToken ( '\n', &num );
406
 
396
 
407
	for ( int i = 0; i < num; i++ )
397
	for ( int i = 0; i < num; i++ )
408
		ParseValueLine ( lines[i] );
398
		ParseValueLine ( lines[i] );
409
 
399
 
410
	CLEANSPLIT(lines, num);
400
	CLEANSPLIT(lines, num);
411
}
401
}
412
 
402
 
413
bool CMultiSpkFile::ReadFile ( CyString filename, bool readdata )
403
bool CMultiSpkFile::ReadFile ( CyString filename, bool bReadData)
414
{
404
{
415
	FILE *id = fopen ( filename.c_str(), "rb" );
405
	CFileIO File(filename);
416
	if ( !id )
-
 
417
		return false;
406
	if ( !File.startRead() ) return false;
418
 
407
 
419
	// first read the header
408
	// first read the header
420
	if ( !ParseHeader ( CSpkFile::GetEndOfLine ( id, NULL, false ) ) )
409
	if ( !ParseHeader(File.readEndOfLine()) ) return false;
421
		return false;
-
 
422
 
410
 
423
	ClearFiles ();
411
	ClearFiles ();
424
 
412
 
425
	int doneLen = 0;
413
	int doneLen = 0;
426
	// next read the data values for the spk files
414
	// next read the data values for the spk files
427
	if ( m_SHeader.lComprLen )
415
	if ( m_SHeader.lComprLen )
428
	{
416
	{
429
		// read data to memory
417
		// read data to memory
430
		unsigned char *readData = new unsigned char[m_SHeader.lComprLen + 1];
-
 
431
		unsigned char size[4];
418
		unsigned long uncomprLen = File.readSize();
432
		fread ( size, 4, 1, id );
-
 
433
		fread ( readData, sizeof(unsigned char), m_SHeader.lComprLen, id );
419
		unsigned char *readData = File.read(m_SHeader.lComprLen);
434
		unsigned long uncomprLen = (size[0] << 24) + (size[1] << 16) + (size[2] << 8) + size[3];
-
 
435
 
420
 
436
		// check for zlib compression
421
		// check for zlib compression
437
		if ( m_SHeader.iCompression == SPKCOMPRESS_ZLIB )
422
		if ( m_SHeader.iCompression == SPKCOMPRESS_ZLIB ) {
438
		{
-
 
439
			// uncomress the data
423
			// uncomress the data
440
			unsigned char *uncompr = new unsigned char[uncomprLen];
424
			unsigned char *uncompr = new unsigned char[uncomprLen];
441
			
425
			
442
			int err = uncompress ( uncompr, &uncomprLen, readData, m_SHeader.lComprLen );
426
			int err = uncompress ( uncompr, &uncomprLen, readData, m_SHeader.lComprLen );
443
			if ( err == Z_OK )
-
 
444
				ReadValues ( CyString ((char *)uncompr) );
427
			if ( err == Z_OK ) ReadValues ( CyString ((char *)uncompr) );
445
			doneLen = uncomprLen;
428
			doneLen = uncomprLen;
446
			delete uncompr;
429
			delete uncompr;
447
		}
430
		}
448
		else if ( m_SHeader.iCompression == SPKCOMPRESS_7ZIP )
431
		else if ( m_SHeader.iCompression == SPKCOMPRESS_7ZIP ) {
449
		{
-
 
450
			long len = uncomprLen;
432
			long len = uncomprLen;
451
			unsigned char *compr = LZMADecode_C ( readData, m_SHeader.lComprLen, (size_t *)&len, NULL );
433
			unsigned char *compr = LZMADecode_C ( readData, m_SHeader.lComprLen, (size_t *)&len, NULL );
452
			if ( compr )
-
 
453
				ReadValues ( CyString ((char *)compr) );
434
			if ( compr ) ReadValues ( CyString ((char *)compr) );
454
		}
435
		}
455
		// no compression
436
		// no compression
456
		else
437
		else
457
			ReadValues ( CyString ((char *)readData) );
438
			ReadValues ( CyString ((char *)readData) );
458
 
439
 
459
		delete readData;
440
		delete readData;
460
	}
441
	}
461
 
442
 
462
	if ( readdata )
443
	if ( bReadData ) {
463
	{
-
 
464
		for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
444
		for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() ) {
465
		{
-
 
466
			SMultiSpkFile *ms = node->Data();
445
			SMultiSpkFile *ms = node->Data();
467
			ms->sData = new char[ms->lSize];
446
			ms->sData = (char *)File.read(ms->lSize);
468
			fread ( ms->sData, sizeof(char), ms->lSize, id );
-
 
469
		}
447
		}
470
	}
448
	}
471
 
449
 
472
	m_sFilename = filename;
450
	m_sFilename = filename;
473
 
451
 
474
	fclose ( id );
452
	File.close();
475
	m_bChanged = false;
453
	m_bChanged = false;
476
 
454
 
477
	return true;
455
	return true;
478
}
456
}
479
 
457