Subversion Repositories spk

Rev

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

Rev 204 Rev 219
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(const Utils::String &file, bool on )
42
bool CMultiSpkFile::addFileNow(const Utils::WString &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).filenameStr();
46
		Utils::WString findFile = CFileIO(file).filename();
47
 
47
 
48
		const SMultiSpkFile *p = this->findFile(findFile);
48
		const SMultiSpkFile *p = this->findFile(findFile);
49
		if ( p )
49
		if ( p )
50
		{
50
		{
51
			this->CreatePackage(const_cast<SMultiSpkFile*>(p));
51
			this->CreatePackage(const_cast<SMultiSpkFile*>(p));
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(const Utils::String &file, bool on)
95
bool CMultiSpkFile::addFile(const Utils::WString &file, bool on)
96
{
96
{
97
	// multipack
97
	// multipack
98
	if (file.contains( "::" ))
98
	if (file.contains(L"::" ))
99
	{
99
	{
100
		Utils::String mfile = file.left(file.findPos("::"));
100
		Utils::WString mfile = file.left(file.findPos(L"::"));
101
		CMultiSpkFile spkfile;
101
		CMultiSpkFile spkfile;
102
		if ( spkfile.readFile(mfile, false))
102
		if ( spkfile.readFile(mfile, false))
103
		{
103
		{
104
			SMultiSpkFile *ms = new SMultiSpkFile;
104
			SMultiSpkFile *ms = new SMultiSpkFile;
105
			ms->bRemove = false;
105
			ms->bRemove = false;
106
			ms->sName = file.right((int)(file.length() - file.findPos("::")) - 2 );
106
			ms->sName = file.right((int)(file.length() - file.findPos(L"::")) - 2 );
107
			ms->pFile = NULL;
107
			ms->pFile = NULL;
108
			ms->sData = NULL;
108
			ms->sData = NULL;
109
			if ( spkfile.extractData(ms))
109
			if ( spkfile.extractData(ms))
110
			{
110
			{
111
				ms->bOn = on;
111
				ms->bOn = on;
Line 152... Line 152...
152
 
152
 
153
	// create entry
153
	// create entry
154
	SMultiSpkFile *ms = new SMultiSpkFile;
154
	SMultiSpkFile *ms = new SMultiSpkFile;
155
	ms->bRemove = false;
155
	ms->bRemove = false;
156
	ms->pFile = NULL;
156
	ms->pFile = NULL;
157
	ms->sName = CFileIO(file).filenameStr();
157
	ms->sName = CFileIO(file).filename();
158
	ms->bOn = on;
158
	ms->bOn = on;
159
 
159
 
160
	// read data
160
	// read data
161
	ms->sData = (char *)File.readAll((size_t *)&ms->lSize);
161
	ms->sData = (char *)File.readAll((size_t *)&ms->lSize);
162
	File.close();
162
	File.close();
Line 167... Line 167...
167
	else if ( check == SPKFILE_SINGLESHIP )
167
	else if ( check == SPKFILE_SINGLESHIP )
168
		baseFile = new CXspFile;
168
		baseFile = new CXspFile;
169
 
169
 
170
	if ( baseFile ) {
170
	if ( baseFile ) {
171
		if ( baseFile->readFile(file, SPKREAD_VALUES)) {
171
		if ( baseFile->readFile(file, SPKREAD_VALUES)) {
172
			ms->sScriptAuthor	= baseFile->author().toString();
172
			ms->sScriptAuthor	= baseFile->author();
173
			ms->sScriptName		= baseFile->name().toString();
173
			ms->sScriptName		= baseFile->name();
174
			ms->sScriptVersion	= baseFile->version().toString();
174
			ms->sScriptVersion	= baseFile->version();
175
			ms->iType			= baseFile->GetType();
175
			ms->iType			= baseFile->GetType();
176
		}
176
		}
177
 
177
 
178
		delete baseFile;
178
		delete baseFile;
179
	}
179
	}
Line 181... Line 181...
181
	addFile(ms);
181
	addFile(ms);
182
 
182
 
183
	return true;
183
	return true;
184
}
184
}
185
 
185
 
186
SMultiSpkFile *CMultiSpkFile::addFileEntry(const Utils::String &filename)
186
SMultiSpkFile *CMultiSpkFile::addFileEntry(const Utils::WString &filename)
187
{
187
{
188
	SMultiSpkFile *ms = new SMultiSpkFile;
188
	SMultiSpkFile *ms = new SMultiSpkFile;
189
	ms->bRemove = false;
189
	ms->bRemove = false;
190
	ms->pFile = NULL;
190
	ms->pFile = NULL;
191
	ms->sName = filename;
191
	ms->sName = filename;
Line 197... Line 197...
197
 
197
 
198
	return ms;
198
	return ms;
199
}
199
}
200
 
200
 
201
 
201
 
202
bool CMultiSpkFile::writeFile(const Utils::String &filename, CProgressInfo *progress)
202
bool CMultiSpkFile::writeFile(const Utils::WString &filename, CProgressInfo *progress)
203
{
203
{
204
	CFileIO File(filename);
204
	CFileIO File(filename);
205
	if ( !File.startWrite() ) return false;
205
	if ( !File.startWrite() ) return false;
206
 
206
 
207
	// make sure we remove all packages that have been marked
207
	// make sure we remove all packages that have been marked
208
	this->RemovePackages();
208
	this->RemovePackages();
209
 
209
 
210
	Utils::String data = _createData();
210
	Utils::WString data = _createData();
211
 
211
 
212
	int comprLen = (int)data.length(), uncomprLen = comprLen;;
212
	int comprLen = (int)((data.length() + sizeof(wchar_t)) / sizeof(char)), uncomprLen = comprLen;;
213
	unsigned char *compr = NULL;
213
	unsigned char *compr = NULL;
214
 
214
 
215
	bool compressed = false;
215
	bool compressed = false;
216
	int valueheader = m_SHeader.iCompression;
216
	int valueheader = m_SHeader.iCompression;
217
	if ( valueheader == SPKCOMPRESS_7ZIP )
217
	if ( valueheader == SPKCOMPRESS_7ZIP )
Line 224... Line 224...
224
			comprLen = 200;
224
			comprLen = 200;
225
		else if ( comprLen < 1000 )
225
		else if ( comprLen < 1000 )
226
			comprLen *= 2;
226
			comprLen *= 2;
227
 
227
 
228
		compr = (unsigned char *)calloc((unsigned int)comprLen, 1);
228
		compr = (unsigned char *)calloc((unsigned int)comprLen, 1);
-
 
229
 
229
		int err = compress ( (unsigned char *)compr, (unsigned long *)&comprLen, (const unsigned char *)data.c_str(), (unsigned long)data.length(), 0 );
230
		int err = compress ( (unsigned char *)compr, (unsigned long *)&comprLen, (const unsigned char *)data.c_str(), (unsigned long)uncomprLen, 0 );
230
		if ( err == Z_OK )
231
		if ( err == Z_OK )
231
			compressed = true;
232
			compressed = true;
232
	}
233
	}
233
 
234
 
234
	if ( !compressed )
235
	if ( !compressed )
235
	{
236
	{
236
		comprLen = uncomprLen;
237
		comprLen = uncomprLen;
237
		compr = (unsigned char *)calloc((unsigned int)comprLen, 1);
238
		compr = (unsigned char *)calloc((unsigned int)comprLen, 1);
238
		memcpy ( compr, data.c_str(), comprLen );
239
		memcpy ( compr, (const unsigned char *)data.c_str(), comprLen );
239
		valueheader = SPKCOMPRESS_NONE;
240
		valueheader = SPKCOMPRESS_NONE;
240
	}
241
	}
241
 
242
 
242
	// write the main header to the file
243
	// write the main header to the file
243
	if ( !File.write("MSPKCycrow;%.2f;%d;%d;%d;%d\n", FILEVERSION, valueheader, data.length(), comprLen, (m_SHeader.bSelection) ? 1 : 0) ) return false;
244
	if ( !File.write("MSPKCycrow;%.2f;%d;%d;%d;%d\n", FILEVERSION, valueheader, data.length(), comprLen, (m_SHeader.bSelection) ? 1 : 0) ) return false;
244
 
245
 
245
	// write the compressed data to file
246
	// write the compressed data to file
246
	File.writeSize(uncomprLen);
247
	File.writeSize(uncomprLen);
247
	File.write(compr, comprLen);
248
	File.write(compr, comprLen);
248
	free ( compr );
249
	free ( compr );
249
 
250
 
250
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() ) {
251
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() ) {
251
		SMultiSpkFile *ms = node->Data();
252
		SMultiSpkFile *ms = node->Data();
252
		if ( progress )
253
		if ( progress )
253
			progress->UpdatePackage(ms);
254
			progress->UpdatePackage(ms);
254
		if ( (!ms->sData) && (ms->pFile) )
255
		if ( (!ms->sData) && (ms->pFile) )
255
			ms->pFile->writeData(File, NULL);
256
			ms->pFile->writeData(File, NULL);
256
		else
257
		else
257
			File.write(ms->sData, ms->lSize);
258
			File.write(ms->sData, ms->lSize);
258
	}
259
	}
259
 
260
 
260
	return true;
261
	return true;
261
}
262
}
262
 
263
 
263
 
264
 
264
void CMultiSpkFile::RemovePackages()
265
void CMultiSpkFile::RemovePackages()
Line 295... Line 296...
295
		if ( m_SHeader.iCompression == SPKCOMPRESS_ZLIB ) {
296
		if ( m_SHeader.iCompression == SPKCOMPRESS_ZLIB ) {
296
			// uncomress the data
297
			// uncomress the data
297
			unsigned char *uncompr = new unsigned char[uncomprLen];
298
			unsigned char *uncompr = new unsigned char[uncomprLen];
298
			
299
			
299
			int err = uncompress ( uncompr, &uncomprLen, readData, m_SHeader.lComprLen );
300
			int err = uncompress ( uncompr, &uncomprLen, readData, m_SHeader.lComprLen );
-
 
301
			if (err == Z_OK)
-
 
302
			{
-
 
303
				if (m_SHeader.fVersion < 4.4f)
-
 
304
				{
300
			if ( err == Z_OK ) _readValues((char *)uncompr);
305
					std::string data((char*)uncompr);
-
 
306
					_readValues(std::wstring(data.begin(), data.end()));
-
 
307
				}
-
 
308
				else
-
 
309
				{
-
 
310
					const wchar_t* data = (const wchar_t*)uncompr;
-
 
311
					_readValues(Utils::WString(data));
-
 
312
				}
-
 
313
			}
301
			doneLen = uncomprLen;
314
			doneLen = uncomprLen;
302
			delete uncompr;
315
			delete uncompr;
303
		}
316
		}
304
		else if ( m_SHeader.iCompression == SPKCOMPRESS_7ZIP ) {
317
		else if ( m_SHeader.iCompression == SPKCOMPRESS_7ZIP ) {
305
			long len = uncomprLen;
318
			long len = uncomprLen;
306
			unsigned char *compr = LZMADecode_C ( readData, m_SHeader.lComprLen, (size_t *)&len, NULL );
319
			unsigned char *compr = LZMADecode_C ( readData, m_SHeader.lComprLen, (size_t *)&len, NULL );
-
 
320
			if (compr)
-
 
321
			{
-
 
322
				if (m_SHeader.fVersion < 4.4f)
-
 
323
				{
307
			if ( compr ) _readValues((char *)compr);
324
					std::string data((char*)compr);
-
 
325
					_readValues(std::wstring(data.begin(), data.end()));
-
 
326
				}
-
 
327
				else
-
 
328
				{
-
 
329
					const wchar_t* data = (const wchar_t*)compr;
-
 
330
					_readValues(Utils::WString(data));
-
 
331
				}
-
 
332
			}
308
		}
333
		}
309
		// no compression
334
		// no compression
310
		else
335
		else
-
 
336
		{
-
 
337
			if (m_SHeader.fVersion < 4.4f)
-
 
338
			{
-
 
339
				std::string data((char*)readData);
-
 
340
				_readValues(std::wstring(data.begin(), data.end()));
-
 
341
			}
-
 
342
			else
-
 
343
			{
-
 
344
				const wchar_t* data = (const wchar_t*)readData;
311
			_readValues((char *)readData);
345
				_readValues(Utils::WString(data));
-
 
346
			}
-
 
347
		}
312
 
348
 
313
		delete readData;
349
		delete readData;
314
	}
350
	}
315
 
351
 
316
	if ( bReadData ) {
352
	if ( bReadData ) {
Line 318... Line 354...
318
			SMultiSpkFile *ms = node->Data();
354
			SMultiSpkFile *ms = node->Data();
319
			ms->sData = (char *)File.read(ms->lSize);
355
			ms->sData = (char *)File.read(ms->lSize);
320
		}
356
		}
321
	}
357
	}
322
 
358
 
323
	_sFilename = filename.toString();
359
	_sFilename = filename;
324
 
360
 
325
	File.close();
361
	File.close();
326
	m_bChanged = false;
362
	m_bChanged = false;
327
 
363
 
328
	return true;
364
	return true;
Line 357... Line 393...
357
	m_lFiles.clear(true);
393
	m_lFiles.clear(true);
358
}
394
}
359
 
395
 
360
bool CMultiSpkFile::extractData(SMultiSpkFile *ms)
396
bool CMultiSpkFile::extractData(SMultiSpkFile *ms)
361
{
397
{
362
	FILE *id = fopen (_sFilename.c_str(), "rb");
398
	FILE *id = _wfopen (_sFilename.c_str(), L"rb");
363
	if ( !id )
399
	if ( !id )
364
		return false;
400
		return false;
365
 
401
 
366
	// skip past the header
402
	// skip past the header
367
	CSpkFile::GetEndOfLine ( id, NULL, false );
403
	CSpkFile::GetEndOfLine ( id, NULL, false );
Line 400... Line 436...
400
bool CMultiSpkFile::ReadFileToMemory ( SMultiSpkFile *ms )
436
bool CMultiSpkFile::ReadFileToMemory ( SMultiSpkFile *ms )
401
{
437
{
402
	if ( ms->sData )
438
	if ( ms->sData )
403
		return true;
439
		return true;
404
 
440
 
405
	FILE *id = fopen(_sFilename.c_str(), "rb");
441
	FILE *id = _wfopen(_sFilename.c_str(), L"rb");
406
	if ( !id )
442
	if ( !id )
407
		return false;
443
		return false;
408
 
444
 
409
	// skip past the header
445
	// skip past the header
410
	CSpkFile::GetEndOfLine ( id, NULL, false );
446
	CSpkFile::GetEndOfLine ( id, NULL, false );
Line 429... Line 465...
429
 
465
 
430
	fclose ( id );
466
	fclose ( id );
431
	return found;
467
	return found;
432
}
468
}
433
 
469
 
434
bool CMultiSpkFile::extractFile(const Utils::String &file, const Utils::String &dir)
470
bool CMultiSpkFile::extractFile(const Utils::WString &file, const Utils::WString &dir)
435
{
471
{
436
	const SMultiSpkFile *ms = findFile(file);
472
	const SMultiSpkFile *ms = findFile(file);
437
	if ( !ms ) return false;
473
	if ( !ms ) return false;
438
	return extractFile(ms, dir);
474
	return extractFile(ms, dir);
439
}
475
}
440
 
476
 
441
bool CMultiSpkFile::extractFile(const SMultiSpkFile *ms, const Utils::String &dir)
477
bool CMultiSpkFile::extractFile(const SMultiSpkFile *ms, const Utils::WString &dir)
442
{
478
{
443
	if ( !ms->sData )
479
	if ( !ms->sData )
444
	{
480
	{
445
		if (!ReadFileToMemory(const_cast<SMultiSpkFile *>(ms)))
481
		if (!ReadFileToMemory(const_cast<SMultiSpkFile *>(ms)))
446
			return false;
482
			return false;
447
	}
483
	}
448
 
484
 
449
	Utils::String filename = dir;
485
	Utils::WString filename = dir;
450
	if (!dir.empty())
486
	if (!dir.empty())
451
		filename += "/";
487
		filename += L"/";
452
	filename += ms->sName;
488
	filename += ms->sName;
453
 
489
 
454
	FILE *id = fopen ( filename.c_str(), ";wb" );
490
	FILE *id = _wfopen(filename.c_str(), L";wb");
455
	if ( !id )
491
	if ( !id )
456
		return false;
492
		return false;
457
 
493
 
458
	if(ms->sData)
494
	if(ms->sData)
459
		fwrite(ms->sData, sizeof(char), ms->lSize, id );
495
		fwrite(ms->sData, sizeof(char), ms->lSize, id );
460
	fclose ( id );
496
	fclose ( id );
461
 
497
 
462
	return true;
498
	return true;
463
}
499
}
464
 
500
 
465
bool CMultiSpkFile::extractAll(const Utils::String &dir)
501
bool CMultiSpkFile::extractAll(const Utils::WString &dir)
466
{
502
{
467
	if (_sFilename.empty())
503
	if (_sFilename.empty())
468
		return false;
-
 
469
 
-
 
470
	if ( !ReadAllFilesToMemory () )
-
 
471
		return false;
504
		return false;
472
 
505
 
-
 
506
	if ( !ReadAllFilesToMemory () )
-
 
507
		return false;
-
 
508
 
473
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
509
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
474
	{
510
	{
475
		SMultiSpkFile *ms = node->Data();
511
		SMultiSpkFile *ms = node->Data();
476
		if ( ms->bRemove ) continue;
512
		if ( ms->bRemove ) continue;
477
		if ( !ms->sData )
513
		if ( !ms->sData )
478
			continue;
514
			continue;
479
 
515
 
480
		FILE *id = fopen ((dir + "/" + ms->sName).c_str(), "wb" );
516
		FILE *id = _wfopen((dir + L"/" + ms->sName).c_str(), L"wb" );
481
		if ( !id )
517
		if ( !id )
482
			continue;
518
			continue;
483
 
519
 
484
		fwrite ( ms->sData, sizeof(char), ms->lSize, id );
520
		fwrite ( ms->sData, sizeof(char), ms->lSize, id );
485
		fclose ( id );
521
		fclose ( id );
486
	}
522
	}
487
	return true;
523
	return true;
488
}
524
}
489
 
525
 
490
bool CMultiSpkFile::splitMulti(const Utils::String &filename, const Utils::String &destdir)
526
bool CMultiSpkFile::splitMulti(const Utils::WString &filename, const Utils::WString &destdir)
491
{
527
{
492
	if ( !readFile(filename))
528
	if ( !readFile(filename))
493
		return false;
529
		return false;
494
 
530
 
495
	bool doneone = false;
531
	bool doneone = false;
496
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
532
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
497
	{
533
	{
498
		SMultiSpkFile *ms = node->Data();
534
		SMultiSpkFile *ms = node->Data();
499
		if ( ms->bRemove ) continue;
535
		if ( ms->bRemove ) continue;
500
		if ( !ms->sData )
536
		if ( !ms->sData )
501
			continue;
537
			continue;
502
 
538
 
503
		Utils::String destfile = destdir;
539
		Utils::WString destfile = destdir;
504
		if ( !destfile.empty() )
540
		if ( !destfile.empty() )
505
			destfile += "/";
541
			destfile += L"/";
506
		destfile += ms->sName;
542
		destfile += ms->sName;
507
		FILE *id = fopen ( destfile.c_str(), ";wb" );
543
		FILE *id = _wfopen(destfile.c_str(), L";wb");
508
		if ( !id )
544
		if ( !id )
509
			continue;
545
			continue;
510
 
546
 
511
		fwrite ( ms->sData, sizeof(char), ms->lSize, id );
547
		fwrite ( ms->sData, sizeof(char), ms->lSize, id );
512
		fclose ( id );
548
		fclose ( id );
Line 521... Line 557...
521
	// no file to read from
557
	// no file to read from
522
	if (_sFilename.empty())
558
	if (_sFilename.empty())
523
		return false;
559
		return false;
524
 
560
 
525
	// now open the file
561
	// now open the file
526
	FILE *id = fopen(_sFilename.c_str(), "rb");
562
	FILE *id = _wfopen(_sFilename.c_str(), L"rb");
527
	if ( !id )
563
	if ( !id )
528
		return false;
564
		return false;
529
 
565
 
530
	// read the header
566
	// read the header
531
	CSpkFile::GetEndOfLine ( id, NULL, false );
567
	CSpkFile::GetEndOfLine ( id, NULL, false );
Line 545... Line 581...
545
			fread ( ms->sData, sizeof(char), ms->lSize, id );
581
			fread ( ms->sData, sizeof(char), ms->lSize, id );
546
		}
582
		}
547
		else
583
		else
548
			fseek ( id, ms->lSize, SEEK_CUR );
584
			fseek ( id, ms->lSize, SEEK_CUR );
549
	}
585
	}
550
 
586
 
551
	return true;
587
	return true;
552
}
588
}
553
 
589
 
554
bool CMultiSpkFile::removeFile(const Utils::String &file)
590
bool CMultiSpkFile::removeFile(const Utils::WString &file)
555
{
591
{
556
	int num = 0;
592
	int num = 0;
557
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
593
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
558
	{
594
	{
559
		SMultiSpkFile *it = node->Data();
595
		SMultiSpkFile *it = node->Data();
560
		if ( file.Compare(it->sName) )
596
		if ( file.Compare(it->sName) )
561
			return removeFile(num);
597
			return removeFile(num);
562
		++num;
598
		++num;
563
	}
599
	}
564
	return false;
600
	return false;
565
}
601
}
566
 
602
 
567
bool CMultiSpkFile::removeFile(const SMultiSpkFile *ms)
603
bool CMultiSpkFile::removeFile(const SMultiSpkFile *ms)
568
{
604
{
569
	int num = 0;
605
	int num = 0;
570
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
606
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
571
	{
607
	{
572
		SMultiSpkFile *it = node->Data();
608
		SMultiSpkFile *it = node->Data();
Line 576... Line 612...
576
	}
612
	}
577
	return false;
613
	return false;
578
}
614
}
579
 
615
 
580
bool CMultiSpkFile::removeFile(int id)
616
bool CMultiSpkFile::removeFile(int id)
581
{
617
{
582
	if ( (id < 0) || (id >= m_lFiles.size()) )
618
	if ( (id < 0) || (id >= m_lFiles.size()) )
583
		return false;
619
		return false;
584
 
620
 
585
	SMultiSpkFile *file = m_lFiles.Get ( id );
621
	SMultiSpkFile *file = m_lFiles.Get ( id );
586
	m_lFiles.erase ( id + 1 );
622
	m_lFiles.erase ( id + 1 );
587
 
623
 
588
	if ( file )
624
	if ( file )
589
		delete file;
625
		delete file;
590
 
626
 
591
	m_bChanged = true;
627
	m_bChanged = true;
592
	return true;
628
	return true;
593
}
629
}
594
 
630
 
595
bool CMultiSpkFile::markRemoveFile(const Utils::String &file)
631
bool CMultiSpkFile::markRemoveFile(const Utils::WString &file)
596
{
632
{
597
	int num = 0;
633
	int num = 0;
598
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
634
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
599
	{
635
	{
600
		SMultiSpkFile *it = node->Data();
636
		SMultiSpkFile *it = node->Data();
Line 615... Line 651...
615
			return markRemoveFile(num);
651
			return markRemoveFile(num);
616
		++num;
652
		++num;
617
	}
653
	}
618
	return false;
654
	return false;
619
}
655
}
620
 
656
 
621
bool CMultiSpkFile::markRemoveFile ( int id )
657
bool CMultiSpkFile::markRemoveFile ( int id )
622
{
658
{
623
	if ( (id < 0) || (id >= m_lFiles.size()) )
659
	if ( (id < 0) || (id >= m_lFiles.size()) )
624
		return false;
660
		return false;
625
 
661
 
626
	SMultiSpkFile *file = m_lFiles.Get ( id );
662
	SMultiSpkFile *file = m_lFiles.Get ( id );
627
	file->bRemove = true;
663
	file->bRemove = true;
628
	m_bChanged = true;
664
	m_bChanged = true;
629
	return true;
665
	return true;
630
}
666
}
631
 
667
 
632
void CMultiSpkFile::markRemoveAll()
668
void CMultiSpkFile::markRemoveAll()
633
{
669
{
634
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
670
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
Line 729... Line 765...
729
	File.close();
765
	File.close();
730
	return true;
766
	return true;
731
}
767
}
732
 
768
 
733
 
769
 
734
const SMultiSpkFile *CMultiSpkFile::findFile(const Utils::String &name) const
770
const SMultiSpkFile *CMultiSpkFile::findFile(const Utils::WString &name) const
735
{
771
{
736
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
772
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
737
	{
773
	{
738
		SMultiSpkFile *ms = node->Data();
774
		SMultiSpkFile *ms = node->Data();
739
		if ( ms->sName.Compare(name) )
775
		if ( ms->sName.Compare(name) )
Line 763... Line 799...
763
	}
799
	}
764
 
800
 
765
	return NULL;
801
	return NULL;
766
}
802
}
767
 
803
 
768
SMultiSpkFile *CMultiSpkFile::findPackage(const Utils::String &name, const Utils::String &author)
804
SMultiSpkFile *CMultiSpkFile::findPackage(const Utils::WString &name, const Utils::WString &author)
769
{
805
{
770
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
806
	for ( CListNode<SMultiSpkFile> *node = m_lFiles.Front(); node; node = node->next() )
771
	{
807
	{
772
		SMultiSpkFile *ms = node->Data();
808
		SMultiSpkFile *ms = node->Data();
773
		if ( !ms->pFile )
809
		if ( !ms->pFile )
Line 776... Line 812...
776
		if (ms->pFile->name().Compare(name) && ms->pFile->author().Compare(author))
812
		if (ms->pFile->name().Compare(name) && ms->pFile->author().Compare(author))
777
			return ms;
813
			return ms;
778
	}
814
	}
779
 
815
 
780
	return NULL;
816
	return NULL;
781
}
817
}
782
 
818
 
783
Utils::String CMultiSpkFile::_createData() const
819
Utils::WString CMultiSpkFile::_createData() const
784
{
820
{
785
	Utils::String ret;
821
	Utils::WString ret;
786
	if (!_sName.empty())
822
	if (!_sName.empty())
787
		ret = "Name: " + _sName + "\n";
823
		ret = L"Name: " + _sName + L"\n";
788
	for (CListNode<SMultiSpkFile>* node = m_lFiles.Front(); node; node = node->next())
824
	for (CListNode<SMultiSpkFile>* node = m_lFiles.Front(); node; node = node->next())
789
	{
825
	{
790
		SMultiSpkFile* ms = node->Data();
826
		SMultiSpkFile* ms = node->Data();
791
		if (ms->iType == TYPE_XSP)
827
		if (ms->iType == TYPE_XSP)
792
			ret += "XspFile: ";
828
			ret += L"XspFile: ";
793
		else
829
		else
794
			ret += "SpkFile: ";
830
			ret += L"SpkFile: ";
795
 
831
 
796
		if (ms->bOn)
832
		if (ms->bOn)
797
			ret += "1:";
833
			ret += L"1:";
798
		else
834
		else
799
			ret += "0:";
835
			ret += L"0:";
800
		ret += ms->lSize;
836
		ret += ms->lSize;
801
		ret += ":";
837
		ret += L":";
802
		ret += ms->sName;
838
		ret += ms->sName;
803
		if (!ms->sScriptName.empty())
839
		if (!ms->sScriptName.empty())
804
			ret += ":" + ms->sScriptName + "|" + ms->sScriptAuthor + "|" + ms->sScriptVersion;
840
			ret += L":" + ms->sScriptName + L"|" + ms->sScriptAuthor + L"|" + ms->sScriptVersion;
805
		ret += "\n";
841
		ret += L"\n";
806
	}
842
	}
807
 
843
 
808
	return ret;
844
	return ret;
809
}
845
}
810
 
846
 
811
bool CMultiSpkFile::_parseHeader(const Utils::String &header)
847
bool CMultiSpkFile::_parseHeader(const Utils::WString &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
{
848
{
-
 
849
	if (header.token(L";", 1) != L"MSPKCycrow")
-
 
850
		return false;
-
 
851
 
-
 
852
	m_SHeader.fVersion = header.token(L";", 2).toFloat();
-
 
853
	if (m_SHeader.fVersion > FILEVERSION)
-
 
854
		return false;
-
 
855
 
-
 
856
	m_SHeader.iCompression = header.token(L";", 3).toInt();
-
 
857
	m_SHeader.lUncomprLen = header.token(L";", 4).toLong();
-
 
858
	m_SHeader.lComprLen = header.token(L";", 5).toLong();
-
 
859
	m_SHeader.bSelection = (header.token(L";", 4).toInt()) ? true : false;
-
 
860
 
-
 
861
	return true;
-
 
862
}
-
 
863
 
-
 
864
bool CMultiSpkFile::_parseValueLine(const Utils::WString &line)
-
 
865
{
830
	Utils::String first = line.token(" ", 1);
866
	Utils::WString first = line.token(L" ", 1);
831
	Utils::String rest = line.tokens(" ", 2);
867
	Utils::WString rest = line.tokens(L" ", 2);
832
 
868
 
833
	if (first == "Name:")
869
	if (first == L"Name:")
834
		_sName = rest;
870
		_sName = rest;
835
	else if (first == "SpkFile:")
871
	else if (first == L"SpkFile:")
836
	{
872
	{
837
		SMultiSpkFile* ms = new SMultiSpkFile;
873
		SMultiSpkFile* ms = new SMultiSpkFile;
838
		ms->bRemove = false;
874
		ms->bRemove = false;
839
		ms->pFile = NULL;
875
		ms->pFile = NULL;
840
		ms->bOn = (rest.token(":", 1).toInt()) ? true : false;
876
		ms->bOn = (rest.token(L":", 1).toInt()) ? true : false;
841
		ms->lSize = rest.token(":", 2).toLong();
877
		ms->lSize = rest.token(L":", 2).toLong();
842
		ms->sName = rest.token(":", 3);
878
		ms->sName = rest.token(L":", 3);
843
		ms->sData = NULL;
879
		ms->sData = NULL;
844
		ms->iType = TYPE_SPK;
880
		ms->iType = TYPE_SPK;
845
		Utils::String r = rest.tokens(":", 4);
881
		Utils::WString r = rest.tokens(L":", 4);
846
		if (!r.empty())
882
		if (!r.empty())
847
		{
883
		{
848
			ms->sScriptName = r.token("|", 1);
884
			ms->sScriptName = r.token(L"|", 1);
849
			ms->sScriptAuthor = r.token("|", 2);
885
			ms->sScriptAuthor = r.token(L"|", 2);
850
			ms->sScriptVersion = r.tokens("|", 3);
886
			ms->sScriptVersion = r.tokens(L"|", 3);
851
		}
887
		}
852
		m_lFiles.push_back(ms);
888
		m_lFiles.push_back(ms);
853
	}
889
	}
854
	else if (first == "XspFile:")
890
	else if (first == L"XspFile:")
855
	{
891
	{
856
		SMultiSpkFile* ms = new SMultiSpkFile;
892
		SMultiSpkFile* ms = new SMultiSpkFile;
857
		ms->bRemove = false;
893
		ms->bRemove = false;
858
		ms->pFile = NULL;
894
		ms->pFile = NULL;
859
		ms->bOn = (rest.token(":", 1).toInt()) ? true : false;
895
		ms->bOn = (rest.token(L":", 1).toInt()) ? true : false;
860
		ms->lSize = rest.token(":", 2).toLong();
896
		ms->lSize = rest.token(L":", 2).toLong();
861
		ms->sName = rest.token(":", 3);
897
		ms->sName = rest.token(L":", 3);
862
		ms->sData = NULL;
898
		ms->sData = NULL;
863
		ms->iType = TYPE_XSP;
899
		ms->iType = TYPE_XSP;
864
		Utils::String r = rest.tokens(":", 4);
900
		Utils::WString r = rest.tokens(L":", 4);
865
		if (!r.empty())
901
		if (!r.empty())
866
		{
902
		{
867
			ms->sScriptName = r.token("|", 1);
903
			ms->sScriptName = r.token(L"|", 1);
868
			ms->sScriptAuthor = r.token("|", 2);
904
			ms->sScriptAuthor = r.token(L"|", 2);
869
			ms->sScriptVersion = r.tokens("|", 3);
905
			ms->sScriptVersion = r.tokens(L"|", 3);
870
		}
906
		}
871
		m_lFiles.push_back(ms);
907
		m_lFiles.push_back(ms);
872
	}
908
	}
873
	else if (first == "BaseFile:")
909
	else if (first == L"BaseFile:")
874
	{
910
	{
875
		SMultiSpkFile* ms = new SMultiSpkFile;
911
		SMultiSpkFile* ms = new SMultiSpkFile;
876
		ms->bRemove = false;
912
		ms->bRemove = false;
877
		ms->pFile = NULL;
913
		ms->pFile = NULL;
878
		ms->bOn = (rest.token(":", 1).toInt()) ? true : false;
914
		ms->bOn = (rest.token(L":", 1).toInt()) ? true : false;
879
		ms->lSize = rest.token(":", 2).toLong();
915
		ms->lSize = rest.token(L":", 2).toLong();
880
		ms->sName = rest.token(":", 3);
916
		ms->sName = rest.token(L":", 3);
881
		ms->sData = NULL;
917
		ms->sData = NULL;
882
		ms->iType = TYPE_BASE;
918
		ms->iType = TYPE_BASE;
883
		Utils::String r = rest.tokens(":", 4);
919
		Utils::WString r = rest.tokens(L":", 4);
884
		if (!r.empty())
920
		if (!r.empty())
885
		{
921
		{
886
			ms->sScriptName = r.token("|", 1);
922
			ms->sScriptName = r.token(L"|", 1);
887
			ms->sScriptAuthor = r.token("|", 2);
923
			ms->sScriptAuthor = r.token(L"|", 2);
888
			ms->sScriptVersion = r.tokens("|", 3);
924
			ms->sScriptVersion = r.tokens(L"|", 3);
889
		}
925
		}
890
		m_lFiles.push_back(ms);
926
		m_lFiles.push_back(ms);
891
	}
927
	}
892
	else
928
	else
893
		return false;
929
		return false;
894
 
930
 
895
	return true;
931
	return true;
896
}
932
}
897
 
933
 
898
void CMultiSpkFile::_readValues(const Utils::String &values)
934
void CMultiSpkFile::_readValues(const Utils::WString &values)
899
{
935
{
900
	int num = 0;
936
	std::vector<Utils::WString> lines;
901
	Utils::String* lines = values.tokenise(&quot;\n", &num);
937
	size_t num = values.tokenise(L&quot;\n", lines);
902
 
938
 
903
	for (int i = 0; i < num; i++)
939
	for (size_t i = 0; i < num; i++)
904
		_parseValueLine(lines[i]);
940
		_parseValueLine(lines[i]);
905
 
-
 
906
	CLEANSPLIT(lines, num);
-
 
907
}
941
}