Subversion Repositories spk

Rev

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

Rev 176 Rev 177
Line 37... Line 37...
37
		p->pFile = new CSpkFile();
37
		p->pFile = new CSpkFile();
38
	else if ( p->iType == TYPE_BASE )
38
	else if ( p->iType == TYPE_BASE )
39
		p->pFile = new CBaseFile();
39
		p->pFile = new CBaseFile();
40
}
40
}
41
 
41
 
42
bool CMultiSpkFile::AddFileNow ( CyString file, bool on )
42
bool CMultiSpkFile::addFileNow(const Utils::String &file, bool on )
43
{
43
{
44
	if ( this->AddFile(file, on) )
44
	if ( this->addFile(file, on) )
45
	{
45
	{
46
		Utils::String findFile = CFileIO(file).filename();
46
		Utils::String findFile = CFileIO(file).filename();
47
 
47
 
48
		SMultiSpkFile *p = this->FindFile(findFile);
48
		const SMultiSpkFile *p = this->findFile(findFile);
49
		if ( p )
49
		if ( p )
50
		{
50
		{
51
			this->CreatePackage(p);
51
			this->CreatePackage(const_cast<SMultiSpkFile*>(p));
52
			if ( p->pFile->readFile(file.ToString(), SPKREAD_ALL))
52
			if ( p->pFile->readFile(file, SPKREAD_ALL))
53
				return true;
53
				return true;
54
		}
54
		}
55
	}
55
	}
56
 
56
 
57
	return false;
57
	return false;
58
}
58
}
59
 
59
 
60
bool CMultiSpkFile::AddFile(SMultiSpkFile *ms)
60
bool CMultiSpkFile::addFile(SMultiSpkFile *ms)
61
{
61
{
62
	bool found = false;
62
	bool found = false;
63
	// find if theres any files with the same filename
63
	// find if theres any files with the same filename
64
	CListNode<SMultiSpkFile> *node;
64
	CListNode<SMultiSpkFile> *node;
65
	for ( node = m_lFiles.Front(); node; node = node->next() )
65
	for ( node = m_lFiles.Front(); node; node = node->next() )
Line 90... Line 90...
90
	m_lFiles.push_back ( ms );
90
	m_lFiles.push_back ( ms );
91
 
91
 
92
	m_bChanged = true;
92
	m_bChanged = true;
93
	return true;
93
	return true;
94
}
94
}
95
bool CMultiSpkFile::AddFile ( CyString sFile, bool on )
95
bool CMultiSpkFile::addFile(const Utils::String &file, bool on)
96
{
96
{
97
	Utils::String file = sFile.ToString();
-
 
98
	// multipack
97
	// multipack
99
	if (file.contains( "::" ))
98
	if (file.contains( "::" ))
100
	{
99
	{
101
		Utils::String mfile = file.left(file.findPos("::"));
100
		Utils::String mfile = file.left(file.findPos("::"));
102
		CMultiSpkFile spkfile;
101
		CMultiSpkFile spkfile;
103
		if ( spkfile.ReadFile ( mfile, false ) )
102
		if ( spkfile.readFile(mfile, false))
104
		{
103
		{
105
			SMultiSpkFile *ms = new SMultiSpkFile;
104
			SMultiSpkFile *ms = new SMultiSpkFile;
106
			ms->bRemove = false;
105
			ms->bRemove = false;
107
			ms->sName = file.right((int)(file.length() - file.findPos("::")) - 2 );
106
			ms->sName = file.right((int)(file.length() - file.findPos("::")) - 2 );
108
			ms->pFile = NULL;
107
			ms->pFile = NULL;
109
			ms->sData = NULL;
108
			ms->sData = NULL;
110
			if ( spkfile.ExtractData ( ms ) )
109
			if ( spkfile.extractData(ms))
111
			{
110
			{
112
				ms->bOn = on;
111
				ms->bOn = on;
113
				AddFile(ms);
112
				addFile(ms);
114
				return true;
113
				return true;
115
			}
114
			}
116
			delete ms;
115
			delete ms;
117
		}
116
		}
118
		return false;
117
		return false;
Line 121... Line 120...
121
	// check its a valid file
120
	// check its a valid file
122
	int check = CBaseFile::CheckFile(file);
121
	int check = CBaseFile::CheckFile(file);
123
	if ( check == SPKFILE_MULTI )
122
	if ( check == SPKFILE_MULTI )
124
	{
123
	{
125
		CMultiSpkFile spkfile;
124
		CMultiSpkFile spkfile;
126
		if ( spkfile.ReadFile ( file, false ) )
125
		if ( spkfile.readFile(file, false))
127
		{
126
		{
128
			CLinkList<SMultiSpkFile> *list = spkfile.GetFileList();
127
			CLinkList<SMultiSpkFile> *list = spkfile.GetFileList();
129
			for ( SMultiSpkFile *it = list->First(); it; it = list->Next() )
128
			for ( SMultiSpkFile *it = list->First(); it; it = list->Next() )
130
			{
129
			{
131
				SMultiSpkFile *ms = new SMultiSpkFile;
130
				SMultiSpkFile *ms = new SMultiSpkFile;
132
				ms->bRemove = false;
131
				ms->bRemove = false;
133
				ms->sName = it->sName;
132
				ms->sName = it->sName;
134
				ms->pFile = NULL;
133
				ms->pFile = NULL;
135
				ms->sData = NULL;
134
				ms->sData = NULL;
136
				if ( spkfile.ExtractData ( ms ) )
135
				if (spkfile.extractData(ms))
137
				{
136
				{
138
					ms->bOn = on;
137
					ms->bOn = on;
139
					AddFile(ms);
138
					addFile(ms);
140
				}
139
				}
141
				else
140
				else
142
					delete ms;
141
					delete ms;
143
			}
142
			}
144
			return true;
143
			return true;
Line 177... Line 176...
177
		}
176
		}
178
 
177
 
179
		delete baseFile;
178
		delete baseFile;
180
	}
179
	}
181
 
180
 
182
	AddFile(ms);
181
	addFile(ms);
183
 
182
 
184
	return true;
183
	return true;
185
}
184
}
186
 
185
 
187
SMultiSpkFile *CMultiSpkFile::AddFileEntry ( CyString filename )
186
SMultiSpkFile *CMultiSpkFile::addFileEntry(const Utils::String &filename)
188
{
187
{
189
	SMultiSpkFile *ms = new SMultiSpkFile;
188
	SMultiSpkFile *ms = new SMultiSpkFile;
190
	ms->bRemove = false;
189
	ms->bRemove = false;
191
	ms->pFile = NULL;
190
	ms->pFile = NULL;
192
	ms->sName = filename.ToString();
191
	ms->sName = filename;
193
	ms->bOn = true;
192
	ms->bOn = true;
194
	ms->iType = -1;
193
	ms->iType = -1;
195
 
194
 
196
	m_lFiles.push_back ( ms );
195
	m_lFiles.push_back ( ms );
197
	m_bChanged = true;
196
	m_bChanged = true;
198
 
197
 
199
	return ms;
198
	return ms;
200
}
199
}
201
 
200
 
202
CyString CMultiSpkFile::CreateData ()
-
 
203
{
-
 
204
	Utils::String ret;
-
 
205
	if ( !_sName.empty() )
-
 
206
		ret = "Name: " + _sName + "\n";
-
 
207
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
-
 
208
	{
-
 
209
		SMultiSpkFile *ms = node->Data();
-
 
210
		if ( ms->iType == TYPE_XSP )
-
 
211
			ret += "XspFile: ";
-
 
212
		else 
-
 
213
			ret += "SpkFile: ";
-
 
214
 
-
 
215
		if ( ms->bOn )
-
 
216
			ret += "1:";
-
 
217
		else
-
 
218
			ret += "0:";
-
 
219
		ret += ms->lSize;
-
 
220
		ret += ":";
-
 
221
		ret += ms->sName;
-
 
222
		if ( !ms->sScriptName.empty() )
-
 
223
			ret += ":" + ms->sScriptName + "|" + ms->sScriptAuthor + "|" + ms->sScriptVersion;
-
 
224
		ret += "\n";
-
 
225
	}
-
 
226
 
-
 
227
	return ret;
-
 
228
}
-
 
229
 
201
 
230
bool CMultiSpkFile::WriteFile ( CyString filename, CProgressInfo *progress )
202
bool CMultiSpkFile::writeFile(const Utils::String &filename, CProgressInfo *progress)
231
{
203
{
232
	CFileIO File(filename);
204
	CFileIO File(filename);
233
	if ( !File.startWrite() ) return false;
205
	if ( !File.startWrite() ) return false;
234
 
206
 
235
	// make sure we remove all packages that have been marked
207
	// make sure we remove all packages that have been marked
236
	this->RemovePackages();
208
	this->RemovePackages();
237
 
209
 
238
	CyString data = CreateData ();
210
	Utils::String data = _createData();
239
 
211
 
240
	int comprLen = (int)data.Length(), uncomprLen = comprLen;;
212
	int comprLen = (int)data.length(), uncomprLen = comprLen;;
241
	unsigned char *compr = NULL;
213
	unsigned char *compr = NULL;
242
 
214
 
243
	bool compressed = false;
215
	bool compressed = false;
244
	int valueheader = m_SHeader.iCompression;
216
	int valueheader = m_SHeader.iCompression;
245
	if ( valueheader == SPKCOMPRESS_7ZIP )
217
	if ( valueheader == SPKCOMPRESS_7ZIP )
Line 252... Line 224...
252
			comprLen = 200;
224
			comprLen = 200;
253
		else if ( comprLen < 1000 )
225
		else if ( comprLen < 1000 )
254
			comprLen *= 2;
226
			comprLen *= 2;
255
 
227
 
256
		compr = (unsigned char *)calloc((unsigned int)comprLen, 1);
228
		compr = (unsigned char *)calloc((unsigned int)comprLen, 1);
257
		int err = compress ( (unsigned char *)compr, (unsigned long *)&comprLen, (const unsigned char *)data.c_str(), (unsigned long)data.Length(), 0 );
229
		int err = compress ( (unsigned char *)compr, (unsigned long *)&comprLen, (const unsigned char *)data.c_str(), (unsigned long)data.length(), 0 );
258
		if ( err == Z_OK )
230
		if ( err == Z_OK )
259
			compressed = true;
231
			compressed = true;
260
	}
232
	}
261
 
233
 
262
	if ( !compressed )
234
	if ( !compressed )
263
	{
235
	{
264
		comprLen = uncomprLen;
236
		comprLen = uncomprLen;
265
		compr = (unsigned char *)calloc((unsigned int)comprLen, 1);
237
		compr = (unsigned char *)calloc((unsigned int)comprLen, 1);
266
		memcpy ( compr, data.c_str(), comprLen );
238
		memcpy ( compr, data.c_str(), comprLen );
267
		valueheader = SPKCOMPRESS_NONE;
239
		valueheader = SPKCOMPRESS_NONE;
268
	}
240
	}
269
 
241
 
270
	// write the main header to the file
242
	// write the main header to the file
271
	if ( !File.write("MSPKCycrow;%.2f;%d;%d;%d;%d\n", FILEVERSION, valueheader, data.Length(), comprLen, (m_SHeader.bSelection) ? 1 : 0) ) return false;
243
	if ( !File.write("MSPKCycrow;%.2f;%d;%d;%d;%d\n", FILEVERSION, valueheader, data.length(), comprLen, (m_SHeader.bSelection) ? 1 : 0) ) return false;
272
 
244
 
273
	// write the compressed data to file
245
	// write the compressed data to file
274
	File.writeSize(uncomprLen);
246
	File.writeSize(uncomprLen);
275
	File.write(compr, comprLen);
247
	File.write(compr, comprLen);
276
	free ( compr );
248
	free ( compr );
277
 
249
 
Line 281... Line 253...
281
			progress->UpdatePackage(ms);
253
			progress->UpdatePackage(ms);
282
		if ( (!ms->sData) && (ms->pFile) )
254
		if ( (!ms->sData) && (ms->pFile) )
283
			ms->pFile->writeData(File, NULL);
255
			ms->pFile->writeData(File, NULL);
284
		else
256
		else
285
			File.write(ms->sData, ms->lSize);
257
			File.write(ms->sData, ms->lSize);
286
	}
-
 
287
 
-
 
288
	return true;
-
 
289
}
-
 
290
 
-
 
291
bool CMultiSpkFile::ParseHeader ( CyString header )
-
 
292
{
-
 
293
	if ( header.GetToken ( 1, ';' ) != "MSPKCycrow" )
-
 
294
		return false;
-
 
295
 
-
 
296
	m_SHeader.fVersion = header.GetToken ( 2, ';' ).ToFloat();
-
 
297
	if ( m_SHeader.fVersion > FILEVERSION )
-
 
298
		return false;
-
 
299
 
-
 
300
	m_SHeader.iCompression = header.GetToken ( 3, ';' ).ToInt();
-
 
301
	m_SHeader.lUncomprLen = header.GetToken ( 4, ';' ).ToLong();
-
 
302
	m_SHeader.lComprLen = header.GetToken ( 5, ';' ).ToLong();
-
 
303
	m_SHeader.bSelection = (header.GetToken ( 4, ';' ).ToInt()) ? true : false;
-
 
304
 
-
 
305
	return true;
-
 
306
}
-
 
307
 
-
 
308
bool CMultiSpkFile::ParseValueLine ( CyString sLine )
-
 
309
{
-
 
310
	Utils::String line = sLine.ToString();
-
 
311
	Utils::String first = line.token(" ", 1);
-
 
312
	Utils::String rest  = line.tokens(" ", 2);
-
 
313
 
-
 
314
	if ( first == "Name:" )
-
 
315
		_sName = rest;
-
 
316
	else if ( first == "SpkFile:" )
-
 
317
	{
-
 
318
		SMultiSpkFile *ms = new SMultiSpkFile;
-
 
319
		ms->bRemove = false;
-
 
320
		ms->pFile = NULL;
-
 
321
		ms->bOn = (rest.token(":", 1).toInt()) ? true : false;
-
 
322
		ms->lSize = rest.token(":", 2).toLong();
-
 
323
		ms->sName = rest.token (":", 3);
-
 
324
		ms->sData = NULL;
-
 
325
		ms->iType = TYPE_SPK;
-
 
326
		Utils::String r = rest.tokens(":", 4);
-
 
327
		if (!r.empty())
-
 
328
		{
-
 
329
			ms->sScriptName = r.token("|", 1);
-
 
330
			ms->sScriptAuthor = r.token("|", 2);
-
 
331
			ms->sScriptVersion = r.tokens("|", 3);
-
 
332
		}
-
 
333
		m_lFiles.push_back ( ms );
-
 
334
	}
-
 
335
	else if ( first == "XspFile:" )
-
 
336
	{
-
 
337
		SMultiSpkFile *ms = new SMultiSpkFile;
-
 
338
		ms->bRemove = false;
-
 
339
		ms->pFile = NULL;
-
 
340
		ms->bOn = (rest.token(":", 1).toInt()) ? true : false;
-
 
341
		ms->lSize = rest.token(":", 2).toLong();
-
 
342
		ms->sName = rest.token(":", 3);
-
 
343
		ms->sData = NULL;
-
 
344
		ms->iType = TYPE_XSP;
-
 
345
		Utils::String r = rest.tokens(":", 4);
-
 
346
		if ( !r.empty() )
-
 
347
		{
-
 
348
			ms->sScriptName = r.token("|", 1);
-
 
349
			ms->sScriptAuthor = r.token("|", 2);
-
 
350
			ms->sScriptVersion = r.tokens("|", 3);
-
 
351
		}
-
 
352
		m_lFiles.push_back ( ms );
-
 
353
	}
-
 
354
	else if ( first == "BaseFile:" )
-
 
355
	{
-
 
356
		SMultiSpkFile *ms = new SMultiSpkFile;
-
 
357
		ms->bRemove = false;
-
 
358
		ms->pFile = NULL;
-
 
359
		ms->bOn = (rest.token(":", 1).toInt()) ? true : false;
-
 
360
		ms->lSize = rest.token(":", 2).toLong();
-
 
361
		ms->sName = rest.token(":", 3);
-
 
362
		ms->sData = NULL;
-
 
363
		ms->iType = TYPE_BASE;
-
 
364
		Utils::String r = rest.tokens(":", 4);
-
 
365
		if (!r.empty())
-
 
366
		{
-
 
367
			ms->sScriptName = r.token("|", 1);
-
 
368
			ms->sScriptAuthor = r.token("|", 2);
-
 
369
			ms->sScriptVersion = r.tokens("|", 3);
-
 
370
		}
-
 
371
		m_lFiles.push_back ( ms );
-
 
372
	}
258
	}
373
	else
-
 
374
		return false;
-
 
375
 
259
 
376
	return true;
260
	return true;
377
}
261
}
-
 
262
 
378
 
263
 
379
void CMultiSpkFile::RemovePackages()
264
void CMultiSpkFile::RemovePackages()
380
{
265
{
381
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
266
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
382
	{
267
	{
383
		if ( !node->Data()->bRemove ) continue;
268
		if ( !node->Data()->bRemove ) continue;
384
		node->DeleteData();
269
		node->DeleteData();
385
	}
270
	}
386
 
-
 
387
	m_lFiles.RemoveEmpty();
-
 
388
}
-
 
389
 
-
 
390
void CMultiSpkFile::ReadValues ( CyString values )
-
 
391
{
-
 
392
	int num = 0;
-
 
393
	CyString *lines = values.SplitToken ( '\n', &num );
-
 
394
 
-
 
395
	for ( int i = 0; i < num; i++ )
-
 
396
		ParseValueLine ( lines[i] );
-
 
397
 
271
 
398
	CLEANSPLIT(lines, num);
272
	m_lFiles.RemoveEmpty();
399
}
273
}
400
 
274
 
-
 
275
 
401
bool CMultiSpkFile::ReadFile ( CyString filename, bool bReadData)
276
bool CMultiSpkFile::readFile(const Utils::String &filename, bool bReadData)
402
{
277
{
403
	CFileIO File(filename);
278
	CFileIO File(filename);
404
	if ( !File.startRead() ) return false;
279
	if ( !File.startRead() ) return false;
405
 
280
 
406
	// first read the header
281
	// first read the header
407
	if ( !ParseHeader(File.readEndOfLine()) ) return false;
282
	if ( !_parseHeader(File.readEndOfLine()) ) return false;
408
 
283
 
409
	ClearFiles ();
284
	ClearFiles ();
410
 
285
 
411
	int doneLen = 0;
286
	int doneLen = 0;
412
	// next read the data values for the spk files
287
	// next read the data values for the spk files
Line 420... Line 295...
420
		if ( m_SHeader.iCompression == SPKCOMPRESS_ZLIB ) {
295
		if ( m_SHeader.iCompression == SPKCOMPRESS_ZLIB ) {
421
			// uncomress the data
296
			// uncomress the data
422
			unsigned char *uncompr = new unsigned char[uncomprLen];
297
			unsigned char *uncompr = new unsigned char[uncomprLen];
423
			
298
			
424
			int err = uncompress ( uncompr, &uncomprLen, readData, m_SHeader.lComprLen );
299
			int err = uncompress ( uncompr, &uncomprLen, readData, m_SHeader.lComprLen );
425
			if ( err == Z_OK ) ReadValues ( CyString ((char *)uncompr) );
300
			if ( err == Z_OK ) _readValues((char *)uncompr);
426
			doneLen = uncomprLen;
301
			doneLen = uncomprLen;
427
			delete uncompr;
302
			delete uncompr;
428
		}
303
		}
429
		else if ( m_SHeader.iCompression == SPKCOMPRESS_7ZIP ) {
304
		else if ( m_SHeader.iCompression == SPKCOMPRESS_7ZIP ) {
430
			long len = uncomprLen;
305
			long len = uncomprLen;
431
			unsigned char *compr = LZMADecode_C ( readData, m_SHeader.lComprLen, (size_t *)&len, NULL );
306
			unsigned char *compr = LZMADecode_C ( readData, m_SHeader.lComprLen, (size_t *)&len, NULL );
432
			if ( compr ) ReadValues ( CyString ((char *)compr) );
307
			if ( compr ) _readValues((char *)compr);
433
		}
308
		}
434
		// no compression
309
		// no compression
435
		else
310
		else
436
			ReadValues ( CyString ((char *)readData) );
311
			_readValues((char *)readData);
437
 
312
 
438
		delete readData;
313
		delete readData;
439
	}
314
	}
440
 
315
 
441
	if ( bReadData ) {
316
	if ( bReadData ) {
Line 443... Line 318...
443
			SMultiSpkFile *ms = node->Data();
318
			SMultiSpkFile *ms = node->Data();
444
			ms->sData = (char *)File.read(ms->lSize);
319
			ms->sData = (char *)File.read(ms->lSize);
445
		}
320
		}
446
	}
321
	}
447
 
322
 
448
	_sFilename = filename.ToString();
323
	_sFilename = filename;
449
 
324
 
450
	File.close();
325
	File.close();
451
	m_bChanged = false;
326
	m_bChanged = false;
452
 
327
 
453
	return true;
328
	return true;
Line 480... Line 355...
480
void CMultiSpkFile::ClearFiles ()
355
void CMultiSpkFile::ClearFiles ()
481
{
356
{
482
	m_lFiles.clear(true);
357
	m_lFiles.clear(true);
483
}
358
}
484
 
359
 
485
bool CMultiSpkFile::ExtractData ( SMultiSpkFile *ms )
360
bool CMultiSpkFile::extractData(SMultiSpkFile *ms)
486
{
361
{
487
	FILE *id = fopen (_sFilename.c_str(), "rb");
362
	FILE *id = fopen (_sFilename.c_str(), "rb");
488
	if ( !id )
363
	if ( !id )
489
		return false;
364
		return false;
490
 
365
 
Line 552... Line 427...
552
			fseek ( id, it->lSize, SEEK_CUR );
427
			fseek ( id, it->lSize, SEEK_CUR );
553
	}
428
	}
554
 
429
 
555
	fclose ( id );
430
	fclose ( id );
556
	return found;
431
	return found;
557
}
432
}
558
 
433
 
559
bool CMultiSpkFile::ExtractFile ( const CyString &file, CyString dir )
434
bool CMultiSpkFile::extractFile(const Utils::String &file, const Utils::String &dir)
560
{
435
{
561
	SMultiSpkFile *ms = FindFile(file);
436
	const SMultiSpkFile *ms = findFile(file);
562
	if ( !ms ) return false;
437
	if ( !ms ) return false;
563
	return ExtractFile(ms, dir);
438
	return extractFile(ms, dir);
564
}
439
}
565
 
440
 
566
bool CMultiSpkFile::ExtractFile ( SMultiSpkFile *ms, CyString dir )
441
bool CMultiSpkFile::extractFile(const SMultiSpkFile *ms, const Utils::String &dir)
567
{
442
{
568
	if ( !ms->sData )
443
	if ( !ms->sData )
569
	{
444
	{
570
		if ( !ReadFileToMemory ( ms ) )
445
		if (!ReadFileToMemory(const_cast<SMultiSpkFile *>(ms)))
571
			return false;
446
			return false;
572
	}
447
	}
573
 
448
 
574
	CyString filename = dir;
449
	Utils::String filename = dir;
575
	if ( !dir.Empty() )
450
	if (!dir.empty())
576
		filename += "/";
451
		filename += "/";
577
	filename += ms->sName;
452
	filename += ms->sName;
578
 
453
 
579
	FILE *id = fopen ( filename.c_str(), "wb" );
454
	FILE *id = fopen ( filename.c_str(), "wb" );
580
	if ( !id )
455
	if ( !id )
581
		return false;
456
		return false;
582
 
457
 
-
 
458
	if(ms->sData)
583
	fwrite ( ms->sData, sizeof(char), ms->lSize, id );
459
		fwrite(ms->sData, sizeof(char), ms->lSize, id );
584
	fclose ( id );
460
	fclose ( id );
585
 
461
 
586
	return true;
462
	return true;
587
}
463
}
588
 
464
 
589
bool CMultiSpkFile::ExtractAll ( CyString dir )
465
bool CMultiSpkFile::extractAll(const Utils::String &dir)
590
{
466
{
591
	if (_sFilename.empty())
467
	if (_sFilename.empty())
592
		return false;
468
		return false;
593
 
469
 
594
	if ( !ReadAllFilesToMemory () )
470
	if ( !ReadAllFilesToMemory () )
595
		return false;
471
		return false;
596
 
472
 
597
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
473
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
598
	{
474
	{
599
		SMultiSpkFile *ms = node->Data();
475
		SMultiSpkFile *ms = node->Data();
600
		if ( ms->bRemove ) continue;
476
		if ( ms->bRemove ) continue;
601
		if ( !ms->sData )
477
		if ( !ms->sData )
602
			continue;
478
			continue;
603
 
479
 
604
		FILE *id = fopen ( CyString(dir + "/" + ms->sName).c_str(), "wb" );
480
		FILE *id = fopen ((dir + "/" + ms->sName).c_str(), "wb" );
605
		if ( !id )
481
		if ( !id )
606
			continue;
482
			continue;
607
 
483
 
608
		fwrite ( ms->sData, sizeof(char), ms->lSize, id );
484
		fwrite ( ms->sData, sizeof(char), ms->lSize, id );
609
		fclose ( id );
485
		fclose ( id );
610
	}
486
	}
611
	return true;
487
	return true;
612
}
488
}
613
 
489
 
614
bool CMultiSpkFile::SplitMulti ( CyString filename, CyString destdir )
490
bool CMultiSpkFile::splitMulti(const Utils::String &filename, const Utils::String &destdir)
615
{
491
{
616
	if ( !ReadFile ( filename ) )
492
	if ( !readFile(filename))
617
		return false;
493
		return false;
618
 
494
 
619
	bool doneone = false;
495
	bool doneone = false;
620
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
496
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
621
	{
497
	{
622
		SMultiSpkFile *ms = node->Data();
498
		SMultiSpkFile *ms = node->Data();
623
		if ( ms->bRemove ) continue;
499
		if ( ms->bRemove ) continue;
624
		if ( !ms->sData )
500
		if ( !ms->sData )
625
			continue;
501
			continue;
626
 
502
 
627
		CyString destfile = destdir;
503
		Utils::String destfile = destdir;
628
		if ( !destfile.Empty() )
504
		if ( !destfile.empty() )
629
			destfile += "/";
505
			destfile += "/";
630
		destfile += ms->sName;
506
		destfile += ms->sName;
631
		FILE *id = fopen ( destfile.c_str(), "wb" );
507
		FILE *id = fopen ( destfile.c_str(), "wb" );
632
		if ( !id )
508
		if ( !id )
633
			continue;
509
			continue;
Line 647... Line 523...
647
		return false;
523
		return false;
648
 
524
 
649
	// now open the file
525
	// now open the file
650
	FILE *id = fopen(_sFilename.c_str(), "rb");
526
	FILE *id = fopen(_sFilename.c_str(), "rb");
651
	if ( !id )
527
	if ( !id )
652
		return false;
528
		return false;
653
 
529
 
654
	// read the header
530
	// read the header
655
	CSpkFile::GetEndOfLine ( id, NULL, false );
531
	CSpkFile::GetEndOfLine ( id, NULL, false );
656
	// skip past values
532
	// skip past values
657
	fseek ( id, 4, SEEK_CUR );
533
	fseek ( id, 4, SEEK_CUR );
Line 668... Line 544...
668
			ms->sData = new char[ms->lSize];
544
			ms->sData = new char[ms->lSize];
669
			fread ( ms->sData, sizeof(char), ms->lSize, id );
545
			fread ( ms->sData, sizeof(char), ms->lSize, id );
670
		}
546
		}
671
		else
547
		else
672
			fseek ( id, ms->lSize, SEEK_CUR );
548
			fseek ( id, ms->lSize, SEEK_CUR );
673
	}
549
	}
674
 
550
 
675
	return true;
551
	return true;
676
}
552
}
677
 
553
 
678
bool CMultiSpkFile::RemoveFile ( CyString sFile )
554
bool CMultiSpkFile::removeFile(const Utils::String &file)
679
{
555
{
680
	Utils::String file = sFile.ToString();
-
 
681
	int num = 0;
556
	int num = 0;
682
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
557
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
683
	{
558
	{
684
		SMultiSpkFile *it = node->Data();
559
		SMultiSpkFile *it = node->Data();
685
		if ( file.Compare(it->sName) )
560
		if ( file.Compare(it->sName) )
686
			return RemoveFile ( num );
561
			return removeFile(num);
687
		++num;
562
		++num;
688
	}
563
	}
689
	return false;
564
	return false;
690
}
565
}
691
 
566
 
692
bool CMultiSpkFile::RemoveFile ( SMultiSpkFile *ms )
567
bool CMultiSpkFile::removeFile(const SMultiSpkFile *ms)
693
{
568
{
694
	int num = 0;
569
	int num = 0;
695
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
570
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
696
	{
571
	{
697
		SMultiSpkFile *it = node->Data();
572
		SMultiSpkFile *it = node->Data();
698
		if ( it == ms )
573
		if ( it == ms )
699
			return RemoveFile ( num );
574
			return removeFile(num);
700
		++num;
575
		++num;
701
	}
576
	}
702
	return false;
577
	return false;
703
}
578
}
704
 
579
 
705
bool CMultiSpkFile::RemoveFile ( int id )
580
bool CMultiSpkFile::removeFile(int id)
706
{
581
{
707
	if ( (id < 0) || (id >= m_lFiles.size()) )
582
	if ( (id < 0) || (id >= m_lFiles.size()) )
708
		return false;
583
		return false;
709
 
584
 
710
	SMultiSpkFile *file = m_lFiles.Get ( id );
585
	SMultiSpkFile *file = m_lFiles.Get ( id );
Line 715... Line 590...
715
 
590
 
716
	m_bChanged = true;
591
	m_bChanged = true;
717
	return true;
592
	return true;
718
}
593
}
719
 
594
 
720
bool CMultiSpkFile::MarkRemoveFile ( CyString sFile )
595
bool CMultiSpkFile::markRemoveFile(const Utils::String &file)
721
{
596
{
722
	Utils::String file = sFile.ToString();
-
 
723
	int num = 0;
597
	int num = 0;
724
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
598
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
725
	{
599
	{
726
		SMultiSpkFile *it = node->Data();
600
		SMultiSpkFile *it = node->Data();
727
		if ( file.Compare(it->sName) )
601
		if ( file.Compare(it->sName) )
728
			return MarkRemoveFile ( num );
602
			return markRemoveFile(num);
729
		num++;
603
		num++;
730
	}
604
	}
731
	return false;
605
	return false;
732
}
606
}
733
 
607
 
734
bool CMultiSpkFile::MarkRemoveFile ( SMultiSpkFile *ms )
608
bool CMultiSpkFile::markRemoveFile(SMultiSpkFile *ms)
735
{
609
{
736
	int num = 0;
610
	int num = 0;
737
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
611
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
738
	{
612
	{
739
		SMultiSpkFile *it = node->Data();
613
		SMultiSpkFile *it = node->Data();
740
		if ( it == ms )
614
		if ( it == ms )
741
			return MarkRemoveFile ( num );
615
			return markRemoveFile(num);
742
		++num;
616
		++num;
743
	}
617
	}
744
	return false;
618
	return false;
745
}
619
}
746
 
620
 
747
bool CMultiSpkFile::MarkRemoveFile ( int id )
621
bool CMultiSpkFile::markRemoveFile ( int id )
748
{
622
{
749
	if ( (id < 0) || (id >= m_lFiles.size()) )
623
	if ( (id < 0) || (id >= m_lFiles.size()) )
750
		return false;
624
		return false;
751
 
625
 
752
	SMultiSpkFile *file = m_lFiles.Get ( id );
626
	SMultiSpkFile *file = m_lFiles.Get ( id );
753
	file->bRemove = true;
627
	file->bRemove = true;
754
	m_bChanged = true;
628
	m_bChanged = true;
755
	return true;
629
	return true;
756
}
630
}
757
 
631
 
758
void CMultiSpkFile::MarkRemoveAll()
632
void CMultiSpkFile::markRemoveAll()
759
{
633
{
760
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
634
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
761
		node->Data()->bRemove = true;
635
		node->Data()->bRemove = true;
762
	m_bChanged = true;
636
	m_bChanged = true;
763
}
637
}
764
 
638
 
765
 
639
 
766
bool CMultiSpkFile::ReadSpk( SMultiSpkFile *ms, int type )
640
bool CMultiSpkFile::ReadSpk( SMultiSpkFile *ms, int type )
767
{
641
{
768
	if ( ms->pFile->IsFullyLoaded() )
642
	if ( ms->pFile->IsFullyLoaded() )
769
		return true;
643
		return true;
770
 
644
 
771
	// no file to read from
645
	// no file to read from
772
	if (_sFilename.empty())
646
	if (_sFilename.empty())
773
		return false;
647
		return false;
774
 
648
 
775
	// now open the file
649
	// now open the file
776
	CFileIO File(_sFilename);
650
	CFileIO File(_sFilename);
777
	if ( !File.startRead() ) return false;
651
	if ( !File.startRead() ) return false;
778
 
652
 
779
	// read the header
653
	// read the header
780
	File.readEndOfLine();
654
	File.readEndOfLine();
781
	// skip past values
655
	// skip past values
782
	File.seek(4 + m_SHeader.lComprLen);
656
	File.seek(4 + m_SHeader.lComprLen);
783
 
657
 
784
	bool ret = false;
658
	bool ret = false;
785
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() ) {
659
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() ) {
786
		SMultiSpkFile *it = node->Data();
660
		SMultiSpkFile *it = node->Data();
787
		if ( it == ms )
661
		if ( it == ms )
788
		{
662
		{
Line 802... Line 676...
802
 
676
 
803
	File.close();
677
	File.close();
804
	return ret;
678
	return ret;
805
}
679
}
806
 
680
 
807
bool CMultiSpkFile::ReadAllPackages( int type, CLinkList<CBaseFile> *addToList )
681
bool CMultiSpkFile::readAllPackages( int type, CLinkList<CBaseFile> *addToList )
808
{
682
{
809
	// no file to read from
683
	// no file to read from
810
	if (_sFilename.empty())
684
	if (_sFilename.empty())
811
		return false;
685
		return false;
812
 
686
 
Line 818... Line 692...
818
	File.readEndOfLine();
692
	File.readEndOfLine();
819
	// skip past values
693
	// skip past values
820
	File.seek(4 + m_SHeader.lComprLen);
694
	File.seek(4 + m_SHeader.lComprLen);
821
 
695
 
822
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() ) {
696
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() ) {
823
		SMultiSpkFile *ms = node->Data();
697
		SMultiSpkFile *ms = node->Data();
824
		CBaseFile *package = NULL;
698
		CBaseFile *package = NULL;
825
		if ( ms->iType == TYPE_XSP )
699
		if ( ms->iType == TYPE_XSP )
826
			package = new CXspFile;
700
			package = new CXspFile;
827
		else
701
		else
828
			package = new CSpkFile;
702
			package = new CSpkFile;
Line 848... Line 722...
848
			// move to correct position in file for next stream of data
722
			// move to correct position in file for next stream of data
849
			// should be fine, this is more of a failsafe
723
			// should be fine, this is more of a failsafe
850
			File.seekStart(tell);
724
			File.seekStart(tell);
851
		}
725
		}
852
		File.seek(ms->lSize);
726
		File.seek(ms->lSize);
853
	}
727
	}
854
 
728
 
855
	File.close();
729
	File.close();
856
	return true;
730
	return true;
857
}
731
}
858
 
732
 
859
 
733
 
860
SMultiSpkFile *CMultiSpkFile::FindFile ( CyString sName )
734
const SMultiSpkFile *CMultiSpkFile::findFile(const Utils::String &name) const
861
{
735
{
862
	Utils::String name = sName.ToString();
-
 
863
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
736
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
864
	{
737
	{
865
		SMultiSpkFile *ms = node->Data();
738
		SMultiSpkFile *ms = node->Data();
866
		if ( ms->sName.Compare(name) )
739
		if ( ms->sName.Compare(name) )
867
			return ms;
740
			return ms;
868
	}
741
	}
869
	return NULL;
742
	return NULL;
870
}
743
}
871
 
744
 
872
void CMultiSpkFile::UpdatedPackage(CBaseFile *p)
745
void CMultiSpkFile::UpdatedPackage(CBaseFile *p)
873
{
746
{
874
	SMultiSpkFile *s = this->FindPackage(p);
747
	SMultiSpkFile *s = this->findPackage(p);
875
	if ( s )
748
	if ( s )
876
	{
749
	{
877
		if ( s->sData )
750
		if ( s->sData )
878
			delete s->sData;
751
			delete s->sData;
879
		s->sData = (char *)p->CreateData((size_t*)&s->lSize);
752
		s->sData = (char *)p->CreateData((size_t*)&s->lSize);
880
	}
753
	}
881
}
754
}
882
 
755
 
883
SMultiSpkFile *CMultiSpkFile::FindPackage(CBaseFile *p)
756
SMultiSpkFile *CMultiSpkFile::findPackage(CBaseFile *p)
884
{
757
{
885
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
758
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
886
	{
759
	{
887
		SMultiSpkFile *ms = node->Data();
760
		SMultiSpkFile *ms = node->Data();
888
		if ( ms->pFile == p )
761
		if ( ms->pFile == p )
889
			return ms;
762
			return ms;
890
	}
763
	}
891
 
764
 
892
	return NULL;
765
	return NULL;
893
}
766
}
894
 
767
 
895
SMultiSpkFile *CMultiSpkFile::FindPackage(CyString name, CyString author)
768
SMultiSpkFile *CMultiSpkFile::findPackage(const Utils::String &name, const Utils::String &author)
896
{
769
{
897
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
770
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
898
	{
771
	{
899
		SMultiSpkFile *ms = node->Data();
772
		SMultiSpkFile *ms = node->Data();
900
		if ( !ms->pFile )
773
		if ( !ms->pFile )
901
			continue;
774
			continue;
902
 
775
 
903
		if ( ms->pFile->name().Compare(name.ToString()) && ms->pFile->author().Compare(author.ToString()) )
776
		if (ms->pFile->name().Compare(name) && ms->pFile->author().Compare(author))
904
			return ms;
777
			return ms;
905
	}
778
	}
906
 
779
 
907
	return NULL;
780
	return NULL;
-
 
781
}
-
 
782
 
-
 
783
Utils::String CMultiSpkFile::_createData() const
-
 
784
{
-
 
785
	Utils::String ret;
-
 
786
	if (!_sName.empty())
-
 
787
		ret = "Name: " + _sName + "\n";
-
 
788
	for (CListNode<SMultiSpkFile>* node = m_lFiles.Front(); node; node = node->next())
-
 
789
	{
-
 
790
		SMultiSpkFile* ms = node->Data();
-
 
791
		if (ms->iType == TYPE_XSP)
-
 
792
			ret += "XspFile: ";
-
 
793
		else
-
 
794
			ret += "SpkFile: ";
-
 
795
 
-
 
796
		if (ms->bOn)
-
 
797
			ret += "1:";
-
 
798
		else
-
 
799
			ret += "0:";
-
 
800
		ret += ms->lSize;
-
 
801
		ret += ":";
-
 
802
		ret += ms->sName;
-
 
803
		if (!ms->sScriptName.empty())
-
 
804
			ret += ":" + ms->sScriptName + "|" + ms->sScriptAuthor + "|" + ms->sScriptVersion;
-
 
805
		ret += "\n";
-
 
806
	}
-
 
807
 
-
 
808
	return ret;
-
 
809
}
-
 
810
 
-
 
811
bool CMultiSpkFile::_parseHeader(const Utils::String &header)
-
 
812
{
-
 
813
	if (header.token(";", 1) != "MSPKCycrow")
-
 
814
		return false;
-
 
815
 
-
 
816
	m_SHeader.fVersion = header.token(";", 2).toFloat();
-
 
817
	if (m_SHeader.fVersion > FILEVERSION)
-
 
818
		return false;
-
 
819
 
-
 
820
	m_SHeader.iCompression = header.token(";", 3).toInt();
-
 
821
	m_SHeader.lUncomprLen = header.token(";", 4).toLong();
-
 
822
	m_SHeader.lComprLen = header.token(";", 5).toLong();
-
 
823
	m_SHeader.bSelection = (header.token(";", 4).toInt()) ? true : false;
-
 
824
 
-
 
825
	return true;
-
 
826
}
-
 
827
 
-
 
828
bool CMultiSpkFile::_parseValueLine(const Utils::String &line)
-
 
829
{
-
 
830
	Utils::String first = line.token(" ", 1);
-
 
831
	Utils::String rest = line.tokens(" ", 2);
-
 
832
 
-
 
833
	if (first == "Name:")
-
 
834
		_sName = rest;
-
 
835
	else if (first == "SpkFile:")
-
 
836
	{
-
 
837
		SMultiSpkFile* ms = new SMultiSpkFile;
-
 
838
		ms->bRemove = false;
-
 
839
		ms->pFile = NULL;
-
 
840
		ms->bOn = (rest.token(":", 1).toInt()) ? true : false;
-
 
841
		ms->lSize = rest.token(":", 2).toLong();
-
 
842
		ms->sName = rest.token(":", 3);
-
 
843
		ms->sData = NULL;
-
 
844
		ms->iType = TYPE_SPK;
-
 
845
		Utils::String r = rest.tokens(":", 4);
-
 
846
		if (!r.empty())
-
 
847
		{
-
 
848
			ms->sScriptName = r.token("|", 1);
-
 
849
			ms->sScriptAuthor = r.token("|", 2);
-
 
850
			ms->sScriptVersion = r.tokens("|", 3);
-
 
851
		}
-
 
852
		m_lFiles.push_back(ms);
-
 
853
	}
-
 
854
	else if (first == "XspFile:")
-
 
855
	{
-
 
856
		SMultiSpkFile* ms = new SMultiSpkFile;
-
 
857
		ms->bRemove = false;
-
 
858
		ms->pFile = NULL;
-
 
859
		ms->bOn = (rest.token(":", 1).toInt()) ? true : false;
-
 
860
		ms->lSize = rest.token(":", 2).toLong();
-
 
861
		ms->sName = rest.token(":", 3);
-
 
862
		ms->sData = NULL;
-
 
863
		ms->iType = TYPE_XSP;
-
 
864
		Utils::String r = rest.tokens(":", 4);
-
 
865
		if (!r.empty())
-
 
866
		{
-
 
867
			ms->sScriptName = r.token("|", 1);
-
 
868
			ms->sScriptAuthor = r.token("|", 2);
-
 
869
			ms->sScriptVersion = r.tokens("|", 3);
-
 
870
		}
-
 
871
		m_lFiles.push_back(ms);
-
 
872
	}
-
 
873
	else if (first == "BaseFile:")
-
 
874
	{
-
 
875
		SMultiSpkFile* ms = new SMultiSpkFile;
-
 
876
		ms->bRemove = false;
-
 
877
		ms->pFile = NULL;
-
 
878
		ms->bOn = (rest.token(":", 1).toInt()) ? true : false;
-
 
879
		ms->lSize = rest.token(":", 2).toLong();
-
 
880
		ms->sName = rest.token(":", 3);
-
 
881
		ms->sData = NULL;
-
 
882
		ms->iType = TYPE_BASE;
-
 
883
		Utils::String r = rest.tokens(":", 4);
-
 
884
		if (!r.empty())
-
 
885
		{
-
 
886
			ms->sScriptName = r.token("|", 1);
-
 
887
			ms->sScriptAuthor = r.token("|", 2);
-
 
888
			ms->sScriptVersion = r.tokens("|", 3);
-
 
889
		}
-
 
890
		m_lFiles.push_back(ms);
-
 
891
	}
-
 
892
	else
-
 
893
		return false;
-
 
894
 
-
 
895
	return true;
-
 
896
}
-
 
897
 
-
 
898
void CMultiSpkFile::_readValues(const Utils::String &values)
-
 
899
{
-
 
900
	int num = 0;
-
 
901
	Utils::String* lines = values.tokenise("\n", &num);
-
 
902
 
-
 
903
	for (int i = 0; i < num; i++)
-
 
904
		_parseValueLine(lines[i]);
-
 
905
 
-
 
906
	CLEANSPLIT(lines, num);
908
}
907
}