Subversion Repositories spk

Rev

Rev 50 | Rev 52 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7 cycrow 1
//header
1 cycrow 2
#include "SpkFile.h"
3
 
7 cycrow 4
// debug logging
5
#include "Logging/Log.h"
6
 
7
// old style compression (needed to convert old formats)
8
#include "../../HiP/HiP.h"
9
 
10 cycrow 10
//TODO: remove this
14 cycrow 11
unsigned char *LineByLineRead ( unsigned char *data, const Utils::String &end, Utils::String *readData )
10 cycrow 12
{
14 cycrow 13
	Utils::String line;
10 cycrow 14
	while ( true )
15
	{
14 cycrow 16
		data = line.readToEndOfLine(data);
7 cycrow 17
 
14 cycrow 18
		if ( (*readData).empty() && line.empty() ) continue;
10 cycrow 19
		if ( line == end )
20
			break;
21
		*readData += (line + "\r\n");
22
	}
23
 
24
	return data;
25
}
26
 
27
 
1 cycrow 28
CSpkFile::CSpkFile() : CBaseFile ()
29
{
30
	SetDefaults ();
31
}
32
 
33
CSpkFile::~CSpkFile()
34
{
35
	Delete ();
36
}
37
/*
38
	Func:   SetDefaults
39
	Desc:   Sets the  default values when class is created
40
*/
41
void CSpkFile::SetDefaults ()
42
{
43
	m_pLastWare = NULL;
44
	m_iPackageType = PACKAGETYPE_NORMAL;
45
	m_bForceProfile = false;
46
	m_iScriptType = SCRIPTTYPE_CUSTOM;
47
 
48
	CBaseFile::SetDefaults ();
49
}
50
 
51
void CSpkFile::Delete ()
52
{
53
	m_lWares.clear(true);
54
	m_lSettings.clear(true);
55
 
56
	CBaseFile::Delete ();
57
}
58
 
59
 
14 cycrow 60
bool CSpkFile::CheckHeader(const Utils::String header) const
1 cycrow 61
{
62
	if ( header.Compare("SPKCycrow") )
63
		return true;
64
	return false;
65
}
66
/*
67
	Func:   ParseValueLine
68
	Input:  String - single line from a file to set
69
	Return: Boolean - returns true if value exists
70
	Desc:   Reads the line and assigns the parameters for the file
71
*/
14 cycrow 72
bool CSpkFile::ParseValueLine(const Utils::String &line)
1 cycrow 73
{
14 cycrow 74
	Utils::String first = line.token(" ", 1);
75
	Utils::String rest  = line.tokens(" ", 2);
1 cycrow 76
 
77
	if ( first == "AnotherMod:" )
78
	{
10 cycrow 79
		m_sOtherAuthor = rest.token("|", 1);
80
		m_sOtherName = rest.tokens("|", 2);
1 cycrow 81
	}
82
	else if ( line == "CustomStart" )
83
		m_iPackageType = PACKAGETYPE_CUSTOMSTART;
84
	else if ( line == "PackageUpdate" )
85
		m_iPackageType = PACKAGETYPE_UPDATE;
86
	else if ( line == "Patch" )
87
		m_iPackageType = PACKAGETYPE_PATCH;
88
	else if ( line == "ForceProfile" )
89
		m_bForceProfile = true;
90
	else if ( line == "Signed" )
91
		m_bSigned = true;
92
	else if ( first == "ScriptType:" )
93
		m_sScriptType = rest;
94
	else if ( first == "ScriptTypeNew:" )
10 cycrow 95
		m_iScriptType = rest;
1 cycrow 96
	else if ( first == "PackageType:" )
10 cycrow 97
		m_iPackageType = rest;
1 cycrow 98
	else if ( first == "Ware:" )
99
		AddWare ( rest );
100
	else if ( (first == "WareText:") && (m_pLastWare) )
101
		AddWareText ( rest );
102
	else if ( first == "Setting:" )
103
	{
10 cycrow 104
		SSettingType *t = AddSetting ( rest.token("|", 2), rest.token("|", 1) );
105
		ConvertSetting ( t, rest.tokens("|", 3));
1 cycrow 106
	}
107
	else
108
		return CBaseFile::ParseValueLine ( line );
109
 
110
	return true;
111
}
112
 
113
/*
114
	Func:   CreateValuesLine
115
	Return: String - returns the full string for values
116
	Desc:   Creates a single string for all values, this is used when compressing to write to the spk file
117
*/
14 cycrow 118
Utils::String CSpkFile::CreateValuesLine () const
1 cycrow 119
{
14 cycrow 120
	Utils::String values = CBaseFile::CreateValuesLine ();
1 cycrow 121
	// combine all values together
10 cycrow 122
	if ( (!m_sOtherAuthor.empty()) && (!m_sOtherName.empty()) )
14 cycrow 123
		values += "AnotherMod: " + m_sOtherAuthor + "|" + m_sOtherName + "\n";
1 cycrow 124
	if ( m_bForceProfile )
125
		values += "ForceProfile\n";
10 cycrow 126
	if ( !m_sScriptType.empty() )
14 cycrow 127
		values += "ScriptType: " + m_sScriptType + "\n";
128
	values += Utils::String("PackageType: ") + (long)m_iPackageType + "\n";
129
	values += Utils::String("ScriptTypeNew: ") + (long)m_iScriptType + "\n";
1 cycrow 130
 
14 cycrow 131
	for ( CListNode<SSettingType> *node = m_lSettings.Front(); node; node = node->next() )
132
		values += Utils::String("Setting: ") + (long)node->Data()->iType + "|" + node->Data()->sKey + "|" + GetSetting(node->Data()) + "\n";
1 cycrow 133
 
14 cycrow 134
	for ( CListNode<SWares> *wNode = m_lWares.Front(); wNode; wNode = wNode->next() ) {
135
		SWares *ware = wNode->Data();
136
		if ( wNode->Data()->iTextID > 0 )
137
			values += Utils::String("Ware: ") + ware->cType + ":" + ware->iPrice + ":" + (long)ware->iSize + ":" + (long)ware->iVolumn + ":" + ware->sID + ":" + (long)ware->iNotority + ":" + (long)ware->iTextID + "," + (long)ware->iTextPage + "\n";
1 cycrow 138
		else
14 cycrow 139
			values += Utils::String("Ware: ") + ware->cType + ":" + ware->iPrice + ":" + (long)ware->iSize + ":" + (long)ware->iVolumn + ":" + ware->sID + ":" + (long)ware->iNotority + "\n";
140
		for ( CListNode<SWaresText> *wtNode = ware->lText.Front(); wtNode; wtNode = wtNode->next() )
141
			values += Utils::String("WareText: ") + (long)wtNode->Data()->iLang + " " + wtNode->Data()->sName + "|" + wtNode->Data()->sDesc + "\n";
1 cycrow 142
	}
143
 
144
	return values;
145
}
146
 
13 cycrow 147
Utils::String CSpkFile::GetCustomScriptType (int lang) const
1 cycrow 148
{
10 cycrow 149
	if ( !m_sScriptType.empty() )
1 cycrow 150
	{
151
		int max;
10 cycrow 152
		Utils::String *split = m_sScriptType.tokenise("<br>", &max);
1 cycrow 153
		if ( max && split )
154
		{
155
			for ( int i = 1; i < max; i++ )
156
			{
10 cycrow 157
				Utils::String str = split[i];
158
				int num = str.token(":", 1);
159
				Utils::String name = str.tokens(":", 2);
1 cycrow 160
 
161
				if ( num == lang )
162
				{
163
					CLEANSPLIT(split, max)
164
					return name;
165
				}
166
			}
167
 
10 cycrow 168
			Utils::String ret = split[0];
1 cycrow 169
			CLEANSPLIT(split, max)
170
 
171
			return ret;
172
		}
173
		CLEANSPLIT(split, max)
174
	}
175
	return m_sScriptType;
176
}
177
 
178
bool CSpkFile::WriteHeader(FILE *id, int valueheader, int valueComprLen)
179
{
180
	fprintf ( id, "SPKCycrow;%.2f;%d;%d\n", FILEVERSION, valueheader, valueComprLen );
181
	if ( ferror(id) )
182
		return false;
183
	return true;
184
}
185
 
10 cycrow 186
void CSpkFile::AddWareText(const Utils::String &sData)
1 cycrow 187
{
188
	if ( !m_pLastWare )
189
		return;
190
 
191
	SWaresText *wt = new SWaresText;
10 cycrow 192
	wt->iLang = sData.token(" ", 1);
193
	wt->sName = sData.tokens(" ", 2).token("|", 1);
194
	wt->sDesc = sData.tokens(" ", 2).tokens("|", 2);
1 cycrow 195
	m_pLastWare->lText.push_back ( wt );
196
 
50 cycrow 197
	_changed();
1 cycrow 198
}
199
 
10 cycrow 200
void CSpkFile::AddWare(const Utils::String &sData)
1 cycrow 201
{
202
	SWares *ware = new SWares;
203
	ware->iTextID = -1;
204
	ware->iTextPage = 0;
10 cycrow 205
	ware->cType = sData.token(":", 1)[0];
206
	ware->iPrice = sData.token(":", 2);
207
	ware->iSize = sData.token(":", 3);
208
	ware->iVolumn = sData.token(":", 4);
209
	ware->sID = sData.token(":", 5);
210
	ware->iNotority = sData.token(":", 6);
211
	if ( !sData.token(":", 7).empty() )
1 cycrow 212
	{
10 cycrow 213
		Utils::String r = sData.token(":", 7);
214
		ware->iTextID = r.token(",", 1);
215
		ware->iTextPage = r.token(",", 2);
1 cycrow 216
	}
217
	m_lWares.push_back ( ware );
218
	m_pLastWare = ware;
219
 
50 cycrow 220
	_changed();
1 cycrow 221
}
222
 
13 cycrow 223
bool CSpkFile::CheckValidReadmes () const
1 cycrow 224
{
225
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
226
	{
227
		C_File *file = node->Data();
228
		if ( file->GetFileType() != FILETYPE_README )
229
			continue;
230
		if ( !file->CheckValidFilePointer() )
231
			continue;
232
		return true;
233
	}
234
 
235
	return false;
236
}
237
 
238
void CSpkFile::ClearWares()
239
{
10 cycrow 240
	for ( CListNode<SWares> *node = m_lWares.Front(); node; node = node->next() ) {
1 cycrow 241
		node->Data()->lText.clear(true);
242
		node->DeleteData();
243
	}
50 cycrow 244
	_changed();
1 cycrow 245
	m_lWares.clear(true);
246
}
247
 
10 cycrow 248
SWares *CSpkFile::FindWare(const Utils::String &id) const
1 cycrow 249
{
10 cycrow 250
	for ( CListNode<SWares> *node = m_lWares.Front(); node; node = node->next() ) {
251
		SWares *w = node->Data();
252
		if ( w->sID.Compare(id) ) {
1 cycrow 253
			return w;
10 cycrow 254
		}
1 cycrow 255
	}
256
	return NULL;
257
}
258
 
10 cycrow 259
void CSpkFile::RemoveWare(const Utils::String &id )
1 cycrow 260
{
10 cycrow 261
	for ( CListNode<SWares> *node = m_lWares.Front(); node; node = node->next() ) {
262
		SWares *w = node->Data();
263
		if ( w->sID.Compare(id) ) {
1 cycrow 264
			m_lWares.RemoveCurrent ();
265
			delete w;
50 cycrow 266
			_changed();
1 cycrow 267
			return;
268
		}
269
	}
270
}
271
 
10 cycrow 272
void CSpkFile::AddWare(SWares *ware)
1 cycrow 273
{
10 cycrow 274
	ware->sID.remove(' ');
1 cycrow 275
 
10 cycrow 276
	SWares *newware = this->FindWare(ware->sID);
277
	if ( newware ) {
278
		m_lWares.remove(newware);
279
	}
1 cycrow 280
 
10 cycrow 281
	m_lWares.push_back(ware);
50 cycrow 282
	_changed();
1 cycrow 283
}
284
 
10 cycrow 285
void CSpkFile::AddWareText(SWares *pWare, int iLang, const Utils::String &sName, const Utils::String &sDesc)
1 cycrow 286
{
287
	SWaresText *wt;
10 cycrow 288
	for ( CListNode<SWaresText> *node = pWare->lText.Front(); node; node = node->next() ) {
289
		wt = node->Data();
290
		if ( wt->iLang == iLang ) {
291
			wt->sDesc = sDesc;
292
			wt->sName = sName;
1 cycrow 293
			return;
294
		}
295
	}
296
 
297
	wt = new SWaresText;
10 cycrow 298
	wt->iLang = iLang;
299
	wt->sName = sName;
300
	wt->sDesc = sDesc;
1 cycrow 301
 
10 cycrow 302
	pWare->lText.push_back(wt);
50 cycrow 303
	_changed();
1 cycrow 304
}
305
 
306
 
10 cycrow 307
void CSpkFile::ClearWareText(const Utils::String &id)
1 cycrow 308
{
10 cycrow 309
	SWares *w = FindWare(id);
310
	ClearWareText(w);
1 cycrow 311
}
312
 
10 cycrow 313
void CSpkFile::ClearWareText(SWares *w)
1 cycrow 314
{
315
	if ( !w ) return;
316
 
317
	w->lText.clear(true);
50 cycrow 318
	_changed();
1 cycrow 319
}
320
 
10 cycrow 321
void CSpkFile::RemoveWareText(const Utils::String &wid, int lang)
1 cycrow 322
{
10 cycrow 323
	SWares *w = FindWare(wid);
1 cycrow 324
	if ( w )
325
	{
10 cycrow 326
		for ( CListNode<SWaresText> *node = w->lText.Front(); node; node = node->next() ) {
327
			SWaresText *wt = node->Data();
328
			if ( wt->iLang == lang ) {
1 cycrow 329
				w->lText.RemoveCurrent();
50 cycrow 330
				_changed();
1 cycrow 331
				delete wt;
332
				break;
333
			}
334
		}
335
	}
336
}
337
 
13 cycrow 338
int CSpkFile::CheckValidCustomStart () const
1 cycrow 339
{
340
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
341
	{
342
		C_File *file = node->Data();
343
		if ( file->GetFileType() != FILETYPE_SCRIPT )
344
			continue;
345
 
14 cycrow 346
		Utils::String basename = file->GetName().GetToken ( 1, file->GetName().NumToken('.') - 1, '.' ).ToString();
347
		if ( basename.right(15).Compare(".initplayership") )
1 cycrow 348
			return 0;
349
	}
350
	if ( !IsAnotherMod() )
351
		return 1;
352
	else
353
		return 2;
354
}
355
 
356
bool CSpkFile::UpdateSigned (bool updateFiles)
357
{
358
	// check for any custom wares
359
	// patch mods and custom starts are also not signed
360
	if ( (!m_lWares.empty()) || (this->IsPatch()) || (this->IsCustomStart()) )
361
	{
362
		m_bSigned = false;
363
		return false;
364
	}
365
 
366
	return CBaseFile::UpdateSigned(updateFiles);
367
}
368
 
14 cycrow 369
SSettingType *CSpkFile::AddSetting(const Utils::String &key, int type )
1 cycrow 370
{
39 cycrow 371
	Utils::String sKey = key.remove('|');
10 cycrow 372
 
1 cycrow 373
	SSettingType *t;
374
	for ( t = m_lSettings.First(); t; t = m_lSettings.Next() )
375
	{
10 cycrow 376
		if ( t->sKey.Compare(sKey) )
1 cycrow 377
			return NULL;
378
	}
379
 
380
	switch ( type )
381
	{
382
		case SETTING_STRING:
383
			t = new SSettingString;
384
			break;
385
		case SETTING_INTEGER:
386
			t = new SSettingInteger;
387
			break;
388
		case SETTING_CHECK:
389
			t = new SSettingCheck;
390
			break;
391
	}
392
 
393
	if ( !t )
394
		return NULL;
395
 
10 cycrow 396
	t->sKey = sKey;
1 cycrow 397
	t->iType = type;
398
 
399
	m_lSettings.push_back ( t );
50 cycrow 400
	_changed();
1 cycrow 401
 
402
	return t;
403
}
404
 
10 cycrow 405
void CSpkFile::ConvertSetting ( SSettingType *t, const Utils::String &set ) const
1 cycrow 406
{
407
	if ( !t )
408
		return;
409
 
410
	switch ( t->iType )
411
	{
412
		case SETTING_STRING:
413
			((SSettingString *)t)->sValue = set;
414
			break;
415
		case SETTING_INTEGER:
10 cycrow 416
			((SSettingInteger *)t)->iValue = set;
1 cycrow 417
			break;
418
		case SETTING_CHECK:
10 cycrow 419
			((SSettingCheck *)t)->bValue = set;
1 cycrow 420
			break;
421
	}
422
}
10 cycrow 423
Utils::String CSpkFile::GetSetting ( SSettingType *t ) const
1 cycrow 424
{
425
	if ( !t )
426
		return "";
427
 
428
	switch ( t->iType )
429
	{
430
		case SETTING_STRING:
431
			return ((SSettingString *)t)->sValue;
432
		case SETTING_INTEGER:
50 cycrow 433
			return Utils::String::Number(((SSettingInteger *)t)->iValue);
1 cycrow 434
		case SETTING_CHECK:
435
			return (((SSettingInteger *)t)->iValue) ? "1" : "0";
436
	}
437
 
438
	return "";
439
}
440
 
441
void CSpkFile::ClearSettings ()
442
{
443
	m_lSettings.clear(true);
50 cycrow 444
	_changed();
1 cycrow 445
}
446
 
447
 
13 cycrow 448
bool CSpkFile::IsMatchingMod(const Utils::String &mod) const
1 cycrow 449
{
450
	for ( CListNode<C_File> *node = m_lFiles.Front(); node; node = node->next() )
451
	{
452
		C_File *file = node->Data();
453
		if ( file->GetFileType() != FILETYPE_MOD )
454
			continue;
455
 
456
		if ( file->IsFakePatch() )
457
			continue;
458
 
10 cycrow 459
		Utils::String filename = file->GetBaseName().ToString();
460
		if ( filename.Compare(mod) )
1 cycrow 461
			return true;
462
	}
463
	return false;
464
}
465
 
13 cycrow 466
Utils::String CSpkFile::GetScriptTypeString(int lang) const
1 cycrow 467
{
468
	int iType = m_iScriptType;
469
 
470
	if ( this->IsLibrary() )
471
		return "Library";
472
	else if ( this->IsPackageUpdate() )
473
		return "Package Update";
474
	else if ( this->IsCustomStart() )
475
		return "Custom Start";
476
	else if ( this->IsPatch() )
477
		return "Patch";
478
	else if ( m_iScriptType == SCRIPTTYPE_CUSTOM )
479
	{
10 cycrow 480
		Utils::String type = this->GetCustomScriptType(lang);
481
		if ( !type.empty() )
1 cycrow 482
			return type;
483
		iType = -1;
484
	}
485
 
486
	if (iType == -1)  // no script type
487
	{
488
		if ( this->IsFakePatch() )
489
			return "Fake Patch";
490
	}
491
 
10 cycrow 492
	Utils::String sType = CSpkFile::GetScriptTypeStringStatic(m_iScriptType);
1 cycrow 493
 
10 cycrow 494
	if ( sType.empty() )
1 cycrow 495
		return "Other";
496
 
497
	return sType;	
498
}
499
 
10 cycrow 500
int CSpkFile::ConvertScriptType(const Utils::String &sType)
1 cycrow 501
{
502
	for ( int i = 0; i < SCRIPTTYPE_MAX; i++ )
503
	{
504
		if ( sType.Compare(CSpkFile::GetScriptTypeStringStatic(i)) )
505
			return i;
506
	}
507
 
508
	return -1;
509
}
510
 
10 cycrow 511
Utils::String CSpkFile::GetScriptTypeStringStatic(int type)
1 cycrow 512
{
513
	switch ( type )
514
	{
515
		case SCRIPTTYPE_CUSTOM:
516
			return "Custom";
517
		case SCRIPTTYPE_NAVIGATION:
518
			return "Navigation";
519
		case SCRIPTTYPE_COMBAT:
520
			return "Combat";
521
		case SCRIPTTYPE_MISSION:
522
			return "Mission";
523
		case SCRIPTTYPE_ALPLUGIN:
524
			return "AL Plugin";
525
		case SCRIPTTYPE_HOTKEY:
526
			return "Hotkey";
527
		case SCRIPTTYPE_SHIPUPGRADE:
528
			return "Ship Upgrade";
529
		case SCRIPTTYPE_SHIPCOMMAND:
530
			return "Ship Command";
531
		case SCRIPTTYPE_STATIONCOMMAND:
532
			return "Station Command";
533
		case SCRIPTTYPE_FLEET:
534
			return "Fleet Management";
535
		case SCRIPTTYPE_TRADE:
536
			return "Trade";
537
		case SCRIPTTYPE_PIRACY:
538
			return "Piracy";
539
		case SCRIPTTYPE_CHEAT:
540
			return "Cheat";
541
		case SCRIPTTYPE_EXTENSION:
542
			return "Extension Mods";
543
		case SCRIPTTYPE_REBALANCE:
544
			return "Rebalance";
545
		case SCRIPTTYPE_FIX:
546
			return "Vanilla Fix";
547
		case SCRIPTTYPE_GENERALMOD:
548
			return "General Mod";
549
		case SCRIPTTYPE_TOTAL:
550
			return "Totel Conversion";
551
		case SCRIPTTYPE_WINGCOMMAND:
552
			return "Wing Command";
553
	}
554
 
555
	return "Other";
556
}
557
 
14 cycrow 558
bool CSpkFile::LoadPackageData(const Utils::String &sFirst, const Utils::String &sRest)
1 cycrow 559
{
14 cycrow 560
	if ( sFirst.Compare("ScriptType") )
1 cycrow 561
	{
14 cycrow 562
		if ( sRest.Compare("Library") || sRest.Compare("Library Script") )
1 cycrow 563
			this->SetLibrary();
14 cycrow 564
		else if ( sRest.Compare("Update") || sRest.Compare("Package Update") || sRest.Compare("Mod Update") )
1 cycrow 565
			this->SetPackageUpdate();
14 cycrow 566
		else if ( sRest.Compare("Start") || sRest.Compare("Custom Start") )
1 cycrow 567
			this->SetCustomStart();
14 cycrow 568
		else if ( sRest.Compare("Patch") || sRest.Compare("Patch Mod") )
1 cycrow 569
			this->SetPatch();
570
		else
571
		{
14 cycrow 572
			int check = sRest;
573
			if ( check || sRest == "0" )
1 cycrow 574
				m_iScriptType = check;
575
			else
576
			{
14 cycrow 577
				m_iScriptType = CSpkFile::ConvertScriptType(sRest);
1 cycrow 578
				if ( m_iScriptType == -1 )
14 cycrow 579
					m_sScriptType = sRest;
1 cycrow 580
			}
581
		}
582
	}
14 cycrow 583
	else if ( sFirst.Compare("AnotherMod") )
1 cycrow 584
	{
14 cycrow 585
		m_sOtherName = sRest.token("|", 1);
586
		m_sOtherAuthor = sRest.tokens("|", 2);
1 cycrow 587
	}
14 cycrow 588
	else if ( sFirst.Compare("WareName") || sFirst.Compare("WareDesc") )
1 cycrow 589
	{
590
		// find the ware to use
591
		SWares *useWare = m_pLastWare;
14 cycrow 592
		Utils::String id = sRest.token(" ", 1);
1 cycrow 593
		for ( CListNode<SWares> *wNode = m_lWares.Front(); wNode; wNode = wNode->next() )
594
		{
10 cycrow 595
			if ( wNode->Data()->sID.Compare(id.c_str()) )
1 cycrow 596
			{
597
				useWare = wNode->Data();
598
				break;
599
			}
600
		}
601
 
602
		// check if we have the id already
603
		if ( useWare )
604
		{
14 cycrow 605
			int lang = sRest.token(" ", 2);
1 cycrow 606
			SWaresText *wt = NULL;
607
			for ( CListNode<SWaresText> *tNode = useWare->lText.Front(); tNode; tNode = tNode->next() )
608
			{
609
				if ( tNode->Data()->iLang == lang )
610
				{
611
					wt = tNode->Data();
612
					break;
613
				}
614
			}
615
 
616
			if ( !wt )
617
			{
618
				wt = new SWaresText;
619
				wt->iLang = lang;
620
				useWare->lText.push_back(wt);
621
			}
622
 
14 cycrow 623
			if ( sFirst.Compare("WareName") )
624
				wt->sName = sRest.tokens(" ", 3);
1 cycrow 625
			else
14 cycrow 626
				wt->sDesc = sRest.tokens(" ", 3);
1 cycrow 627
		}
628
	}
14 cycrow 629
	else if ( sFirst.left(4).Compare("Ware") )
1 cycrow 630
	{
631
		SWares *ware = new SWares;
632
		ware->iTextID = -1;
633
		ware->iTextPage = 0;
14 cycrow 634
		ware->cType = sFirst[4];
635
		ware->iPrice = sRest.token(" ", 2);
636
		ware->iSize = sRest.token(" ", 3);
637
		ware->iVolumn = sRest.token(" ", 4);
638
		ware->sID = sRest.token(" ", 1);
639
		ware->iNotority = sRest.token(" ", 5);
640
		if ( !sRest.token(" ", 6).empty() )
1 cycrow 641
		{
14 cycrow 642
			ware->iTextID = sRest.token(" ", 6).token(",", 2);
643
			ware->iTextPage = sRest.token(" ", 6).token(",", 1);
1 cycrow 644
		}
645
		m_lWares.push_back ( ware );
646
		m_pLastWare = ware;
647
	}
648
 
14 cycrow 649
	else if ( CBaseFile::LoadPackageData(sFirst, sRest) )
1 cycrow 650
		return true;
651
	else
652
		return false;
653
 
654
	return true;
655
}
656
 
657
bool CSpkFile::GeneratePackagerScript(bool wildcard, CyStringList *list, bool datafile)
658
{
659
	if ( !CBaseFile::GeneratePackagerScript(wildcard, list, datafile) )
660
		return false;
661
 
662
	list->PushBack("# Script Type, the type of package file, some are special types, others are just for show");
663
	if ( this->IsLibrary() )
664
		list->PushBack("ScriptType: Library");
665
	else if ( this->IsPackageUpdate() )
666
		list->PushBack("ScriptType: Package Update");
667
	else if ( this->IsCustomStart() )
668
		list->PushBack("ScriptType: Custom Start");
669
	else if ( this->IsPatch() )
670
		list->PushBack("ScriptType: Patch");
671
	else
672
		list->PushBack(CyString("ScriptType: ") + this->GetScriptTypeString(44));
673
	list->PushBack("");
674
 
675
	if ( this->IsAnotherMod() )
676
	{
677
		list->PushBack("# For another mod/package, this is a child package");
678
		list->PushBack(CyString("AnotherMod: ") + m_sOtherName + "|" + m_sOtherAuthor);
679
		list->PushBack("");
680
	}
681
 
682
	if ( !m_lWares.empty() )
683
	{
684
		list->PushBack("# Custom Wares, Ware<type>: <id> <price> <size> <volumn> <notority>");
685
		for ( CListNode<SWares> *node = m_lWares.Front(); node; node = node->next() )
686
		{
687
			SWares *w = node->Data();
688
			if ( w->iTextID > 0 )
689
				list->PushBack(CyString("Ware") + (char)w->cType + ": " + w->sID + " " + (long)w->iPrice + " " + (long)w->iSize + " " + (long)w->iVolumn + " " + (long)w->iNotority + " " + (long)w->iTextPage + "," + (long)w->iTextID);
690
			else
691
				list->PushBack(CyString("Ware") + (char)w->cType + ": " + w->sID + " " + (long)w->iPrice + " " + (long)w->iSize + " " + (long)w->iVolumn + " " + (long)w->iNotority);
692
			for ( CListNode<SWaresText> *wNode = w->lText.Front(); wNode; wNode = wNode->next() )
693
			{
694
				SWaresText *wt = wNode->Data();
10 cycrow 695
				if ( !wt->sName.empty() )
1 cycrow 696
					list->PushBack(CyString("WareName: ") + w->sID + " " + (long)wt->iLang + " " + wt->sName);
10 cycrow 697
				if ( !wt->sDesc.empty() )
1 cycrow 698
					list->PushBack(CyString("WareDesc: ") + w->sID + " " + (long)wt->iLang + " " + wt->sDesc);
699
			}
700
			list->PushBack("");
701
		}
702
	}
703
 
704
	if ( !datafile )
705
	{
706
		if ( !CBaseFile::GeneratePackagerScriptFile(wildcard, list) )
707
			return false;
708
	}
709
 
710
	return true;
711
 
712
}
713
 
10 cycrow 714
Utils::String CSpkFile::GetWareText(SWares *w, int lang)
1 cycrow 715
{
716
	// return the text page if being used
717
	if ( w->iTextID > 0 && w->iTextPage > 0 )
10 cycrow 718
		return Utils::String("{") + (long)w->iTextPage + "," + (long)w->iTextID + "}";
1 cycrow 719
 
10 cycrow 720
	Utils::String name;
1 cycrow 721
	for ( CListNode<SWaresText> *wt = w->lText.Front(); wt; wt = wt->next() )
722
	{
10 cycrow 723
		if ( wt->Data()->sName.empty() )
1 cycrow 724
			continue;
725
		if ( wt->Data()->iLang == lang )
726
			name = wt->Data()->sName;
10 cycrow 727
		else if ( name.empty() && wt->Data()->iLang == 44 )
1 cycrow 728
			name = wt->Data()->sName;
10 cycrow 729
		else if ( name.empty() )
1 cycrow 730
			name = wt->Data()->sName;
731
	}
732
 
733
	return name;
734
}
10 cycrow 735
Utils::String CSpkFile::GetWareDesc(SWares *w, int lang)
1 cycrow 736
{
737
	// return the text page if being used
738
	if ( w->iTextID > 0 && w->iTextPage > 0 )
10 cycrow 739
		return Utils::String("{") + (long)w->iTextPage + "," + ((long)w->iTextID + 1) + "}";
1 cycrow 740
 
10 cycrow 741
	Utils::String name;
1 cycrow 742
	for ( CListNode<SWaresText> *wt = w->lText.Front(); wt; wt = wt->next() )
743
	{
10 cycrow 744
		if ( wt->Data()->sDesc.empty() )
1 cycrow 745
			continue;
746
 
747
		if ( wt->Data()->iLang == lang )
748
			name = wt->Data()->sDesc;
10 cycrow 749
		else if ( name.empty() && wt->Data()->iLang == 44 )
1 cycrow 750
			name = wt->Data()->sDesc;
10 cycrow 751
		else if ( name.empty() )
1 cycrow 752
			name = wt->Data()->sDesc;
753
	}
754
 
755
	return name;
756
}
757
 
13 cycrow 758
Utils::String CSpkFile::GetCustomStartName() const
1 cycrow 759
{
760
	if ( !this->IsCustomStart() )
10 cycrow 761
		return "";
1 cycrow 762
 
763
	// else find the custom start script
764
	C_File *file = NULL;
765
	for ( file = this->GetFirstFile(FILETYPE_SCRIPT); file; file = this->GetNextFile(file) )
766
	{
767
		if ( file->GetFilename().IsIn("initplayership")	&& file->GetFilename().GetToken(".", 1, 1).Compare("galaxy") )
768
			break;
769
	}
770
 
771
	if ( !file )
10 cycrow 772
		return "";
1 cycrow 773
 
10 cycrow 774
	return file->GetFilename().GetToken(".", 2, 2).ToString();
1 cycrow 775
}
776
 
777
void CSpkFile::MergePackage(CBaseFile *base)
778
{
779
	// update possible changes
780
	if ( base->GetType() == TYPE_SPK )
781
	{
782
		CSpkFile *spk = (CSpkFile *)base;
783
		m_bForceProfile = spk->IsForceProfile();
784
 
785
		// add any new wares
786
		if ( spk->AnyWares() )
787
		{
788
			for ( CListNode<SWares> *node = spk->GetWaresList()->Front(); node; node = node->next() )
789
				this->AddWare(node->Data());
790
			spk->GetWaresList()->clear(); // remove wares so they aren't deleted
791
		}
792
 
793
		// add any settings
794
		if ( spk->AnySettings() )
795
		{
796
			for ( CListNode<SSettingType> *node = spk->GetSettingsList()->Front(); node; node = node->next() )
797
				this->AddSetting(node->Data()->sKey, node->Data()->iType);
798
		}
799
 
10 cycrow 800
		if ( !spk->GetOtherName().empty() )
1 cycrow 801
		{
802
			m_sOtherName = spk->GetOtherName();
803
			m_sOtherAuthor = spk->GetOtherAuthor();
804
		}
805
	}
806
 
807
	// copy settings from base class
46 cycrow 808
	_merge(base);
1 cycrow 809
 
810
	for ( CListNode<SGameCompat> *gNode = base->GetGameCompatabilityList()->Front(); gNode; gNode = gNode->next() ) {
46 cycrow 811
		if ( !gNode->Data()->sVersion.empty() )
1 cycrow 812
			this->AddGameCompatability(gNode->Data()->iGame, gNode->Data()->sVersion);
813
		else
46 cycrow 814
			this->AddGameCompatability(gNode->Data()->iGame, (long)gNode->Data()->iVersion);
1 cycrow 815
	}
816
 
817
	// copy over needed librarys
818
	for ( CListNode<SNeededLibrary> *lNode = base->GetNeededLibraries()->Front(); lNode; lNode = lNode->next() )
819
		this->AddNeededLibrary(lNode->Data()->sName, lNode->Data()->sAuthor, lNode->Data()->sMinVersion);
820
 
821
	// web mirror address, add any new ones
822
	for ( SStringList *str = base->GetWebMirrors()->Head(); str; str = str->next )
823
		this->AddWebMirror(str->str);
824
 
825
	// copy over package names
826
	for ( CListNode<SNames> *nNode = base->GetNamesList()->Front(); nNode; nNode = nNode->next() )
827
		this->AddLanguageName(nNode->Data()->iLanguage, nNode->Data()->sName);
828
 
829
	// finally do all the files
830
	for ( CListNode<C_File> *node = base->GetFileList()->Front(); node; node = node->next() )
831
	{
832
		C_File *f = node->Data();
833
		// if it exists, remove the old
834
		for ( CListNode<C_File> *thisNode = m_lFiles.Front(); thisNode; thisNode = thisNode->next() )
835
		{
836
			if ( thisNode->Data()->GetFileType() == f->GetFileType() && thisNode->Data()->GetFilename().Compare(f->GetFilename()) && thisNode->Data()->GetDir().Compare(f->GetDir()) )
837
			{
838
				m_lFiles.remove(thisNode);
839
				break;
840
			}
841
		}
842
 
843
		m_lFiles.push_back(f);
844
	}
845
 
846
	// clear the files so we dont delete them later
847
	base->GetFileList()->clear();
848
}
7 cycrow 849
 
8 cycrow 850
unsigned char *CSpkFile::_convert_uncompressFile(const Utils::String &sOldFilename, int *pLen)
7 cycrow 851
{
10 cycrow 852
	// firstcheck if the file exists
853
	FILE *id = fopen(sOldFilename.c_str(), "rb" );
854
	if ( !id ) {
50 cycrow 855
		CLog::logf(CLog::Log_IO, 1, "Unable to open file: %s", sOldFilename.c_str());
10 cycrow 856
		return false;
857
	}
7 cycrow 858
 
10 cycrow 859
	// read the first 3 charaters to check if its using the original "HiP" compression
14 cycrow 860
	Utils::String check((char)fgetc(id));
10 cycrow 861
	check += (char)fgetc ( id );
862
	check += (char)fgetc ( id );
7 cycrow 863
 
14 cycrow 864
	Utils::String removeFile;
7 cycrow 865
 
10 cycrow 866
	unsigned char *uncomprData = NULL;
867
	unsigned char *data = NULL;
868
	long len = 0, newlen = 0;
869
 
870
	if ( check == "HiP" ) {
871
		fclose ( id );
872
		bool opened = false;
873
		if ( DecompressFile ( (char *)sOldFilename.c_str(), "uncompr.tmp" ) ) {
874
			removeFile = "uncompr.tmp";
875
			id = fopen ( "uncompr.tmp", "r" );
876
			if ( id )
877
				opened = true;
878
		}
879
 
880
		if ( !opened ) {
50 cycrow 881
			CLog::log(CLog::Log_IO, 1, "Unable to uncompress file, exiting...");
10 cycrow 882
			return false;
883
		}
884
 
50 cycrow 885
		CLog::log(CLog::Log_IO, 1, "* Reading file into memory...");
10 cycrow 886
		// get file length
887
		fseek ( id, 0, SEEK_END );
888
		len = ftell ( id );
889
 
890
		// move back to beginning
891
		fseek ( id, 0, SEEK_SET );
892
 
893
		// read the data from file into memory
894
		uncomprData = new unsigned char[len + 1];
895
		fread ( uncomprData, sizeof(unsigned char), len, id );
896
 
897
		newlen = len;
898
	}
899
	else
900
	{
50 cycrow 901
		CLog::log(CLog::Log_IO, 1, "* Reading file into memory...");
10 cycrow 902
		// get file length
903
		fseek ( id, 0, SEEK_END );
904
		len = ftell ( id );
905
 
906
		// move back to beginning
907
		fseek ( id, 0, SEEK_SET );
908
 
909
		// read the data from file into memory
910
		data = new unsigned char[len + 1];
911
		fread ( data, sizeof(unsigned char), len, id );
912
 
913
		// uncompress the file (currently only 7zip compression)
50 cycrow 914
		CLog::log(CLog::Log_IO, 1, "* Uncompressing file...");
10 cycrow 915
		newlen = len;
916
	#ifdef _INCLUDE7ZIP
917
		uncomprData = LZMADecodeData ( data, len, newlen, progress );
918
	#else
919
		uncomprData = LZMADecode_C ( (unsigned char *)data, len, (size_t*)&newlen, NULL );
920
	#endif
921
	}
922
 
923
	*pLen = newlen;
924
 
14 cycrow 925
	if ( !removeFile.empty() ) {
10 cycrow 926
		CFileIO(removeFile).Remove();
927
	}
928
 
7 cycrow 929
	return uncomprData;
930
}
931
 
8 cycrow 932
Utils::String CSpkFile::_convert_fileEndString(const Utils::String &sFile)
7 cycrow 933
{
10 cycrow 934
	if ( sFile.Compare("Text") )
935
		return "-- End of Script --";
936
	else if ( sFile.Compare("Uninstall") )
937
		return "-- End of Uninstall --";
938
	else if ( sFile.Compare("Readme") )
939
		return "-- End of Readme --";
940
	else if ( sFile.Compare("Map") )
941
		return "-- End of Map --";
942
	else if ( sFile.Compare("Mod") || sFile.Compare("Extra") || sFile.Compare("Screen") || sFile.Compare("Sound") )
943
		return "";
944
	return "-- End of Script --";
7 cycrow 945
}
946
 
8 cycrow 947
int CSpkFile::_convert_fileType(const Utils::String &sFile)
7 cycrow 948
{
10 cycrow 949
	if ( sFile.Compare("Text") )
950
		return FILETYPE_TEXT;
951
	else if ( sFile.Compare("Uninstall") )
952
		return FILETYPE_UNINSTALL;
953
	else if ( sFile.Compare("Readme") )
954
		return FILETYPE_README;
955
	else if ( sFile.Compare("Map") )
956
		return FILETYPE_MAP;
957
	else if ( sFile.Compare("Mod") )
958
		return FILETYPE_MOD;
959
	else if ( sFile.Compare("Extra") )
960
		return FILETYPE_EXTRA;
961
	else if ( sFile.Compare("Screen") )
962
		return FILETYPE_SCREEN;
963
	else if ( sFile.Compare("Sound") )
964
		return FILETYPE_SOUND;
965
 
966
	return FILETYPE_SCRIPT;
7 cycrow 967
}
968
 
10 cycrow 969
void CSpkFile::_convert_parse(const Utils::String &sCmd, const Utils::String &sRest)
7 cycrow 970
{
10 cycrow 971
	if ( sCmd == "Name:" )
972
	{
50 cycrow 973
		this->setName ( sRest );
974
		CLog::logf(CLog::Log_EditPackage, 3, "\tScript Name: %s", sRest.c_str() );
10 cycrow 975
	}
976
	else if ( sCmd == "Author:" )
977
	{
50 cycrow 978
		this->setAuthor(sRest);
979
		CLog::logf(CLog::Log_EditPackage, 3, "\tScript Author: %s", sRest.c_str() );
10 cycrow 980
	}
981
	else if ( sCmd == "CustomStart" )
982
	{
983
		this->SetCustomStart();
50 cycrow 984
		CLog::logf(CLog::Log_EditPackage, 3, "\tPackage is a custom start!!" );
10 cycrow 985
	}
986
	else if ( sCmd == "AnotherMod:" )
987
	{
988
		this->SetAnotherMod(sRest.token("|", 1), sRest.tokens("|", 2));
50 cycrow 989
		CLog::logf(CLog::Log_EditPackage, 3, "\tFor another Mod, Name: %s, Author: %s", this->GetOtherName().c_str(), this->GetOtherAuthor().c_str() );
10 cycrow 990
	}
991
	else if ( sCmd == "PATCH" )
992
	{
993
		this->SetPatch();
50 cycrow 994
		CLog::logf(CLog::Log_EditPackage, 3, "\tPackage is a Patch Mod!!" );
10 cycrow 995
	}
996
	else if ( sCmd == "Version:" )
997
	{
50 cycrow 998
		this->setVersion(sRest);
999
		CLog::logf(CLog::Log_EditPackage, 3,"\tScript Version: %s", sRest.c_str() );
10 cycrow 1000
	}
1001
	else if ( sCmd == "Date:" )
1002
	{
50 cycrow 1003
		this->setCreationDate ( sRest );
1004
		CLog::logf(CLog::Log_EditPackage, 3,"\tScript Creation Date: %s", sRest.c_str() );
10 cycrow 1005
	}
48 cycrow 1006
	else if ( sCmd == "Desc:" ) {
1007
		this->setDescription(sRest.findReplace("<br>", "\n") );
50 cycrow 1008
		CLog::logf(CLog::Log_EditPackage, 3,"\tScript Description: %s", this->description().c_str() );
10 cycrow 1009
	}
49 cycrow 1010
	else if ( sCmd == "WebAddress:" ) {
1011
		this->setWebAddress(sRest);
50 cycrow 1012
		CLog::logf(CLog::Log_EditPackage, 3, "\tWeb Address: %s", sRest.c_str() );
10 cycrow 1013
	}
1014
	else if ( sCmd == "WebMirror1:" )
1015
	{
1016
		this->AddWebMirror(sRest);
50 cycrow 1017
		CLog::logf(CLog::Log_EditPackage, 3, "\tWeb Mirror Address: %s", sRest.c_str() );
10 cycrow 1018
	}
1019
	else if ( sCmd == "WebMirror2:" )
1020
	{
1021
		this->AddWebMirror(sRest);
50 cycrow 1022
		CLog::logf(CLog::Log_EditPackage, 3, "\tWeb Mirror Address: %s", sRest.c_str() );
10 cycrow 1023
	}
1024
 
1025
	else if ( sCmd == "ScriptType:" )
1026
		this->SetScriptType (sRest);
49 cycrow 1027
	else if ( sCmd == "WebSite:" ) {
1028
		this->setWebSite ( sRest );
50 cycrow 1029
		CLog::logf(CLog::Log_EditPackage, 3, "\tWeb Site: %s", sRest.c_str() );
10 cycrow 1030
	}
49 cycrow 1031
	else if ( sCmd == "Email:" ) {
1032
		this->setEmail(sRest);
50 cycrow 1033
		CLog::logf(CLog::Log_EditPackage, 3, "\tAuthor Email Address: %s", sRest.c_str() );
10 cycrow 1034
	}
1035
	else if ( sCmd == "GameVersion:" )
1036
	{
1037
		//TODO: fix this for new game version
1038
		/*
1039
		int version = sRest.ToInt();
1040
		if ( version == 0 )
1041
			this->SetGameVersion ( 1 );
1042
		else if (version == 1 )
1043
			this->SetGameVersion ( 0 );
1044
		else
1045
			this->SetGameVersion ( version );
1046
		CLog::logf(CLog::Log_EditPackage, "\tGame Version: %d", this->GetGameVersion () );
1047
		*/
1048
	}
1049
 
1050
	else if ( sCmd == "Ware:" )
1051
	{
1052
		this->AddWare ( sRest );
50 cycrow 1053
		CLog::logf(CLog::Log_EditPackage, 3, "\tAdding Custom Ware" );
10 cycrow 1054
	}
1055
	else if ( sCmd == "WareText:" )
1056
		this->AddWareText ( sRest );
46 cycrow 1057
	else if ( sCmd == "UninstallAfter:" )	this->addUninstallText(sRest.token(" ", 1).toLong(), false, sRest.tokens(" ", 2));
1058
	else if ( sCmd == "UninstallBefore:" )	this->addUninstallText(sRest.token(" ", 1).toLong(), true, sRest.tokens(" ", 2));
1059
	else if ( sCmd == "InstallAfter:" )		this->addInstallText(sRest.token(" ", 1).toLong(), false, sRest.tokens(" ", 2));
1060
	else if ( sCmd == "InstallBefore:" )	this->addInstallText(sRest.token(" ", 1).toLong(), true, sRest.tokens(" ", 2));
10 cycrow 1061
	else if ( sCmd == "ScriptName:" )
1062
	{
1063
		Utils::String lang = sRest.token(":", 1);
1064
		Utils::String name = sRest.tokens(":", 2);
1065
		this->AddLanguageName(lang.toLong(), name);
50 cycrow 1066
		CLog::logf(CLog::Log_EditPackage, 3, "\tScript Name Language (%s) %s", lang.c_str(), name.c_str() );
10 cycrow 1067
	}
7 cycrow 1068
}
1069
 
8 cycrow 1070
Utils::String CSpkFile::_convert_parseFilename(const Utils::String &sRest, float fVersion, Utils::String *pDir)
7 cycrow 1071
{
8 cycrow 1072
	Utils::String sFilename;
7 cycrow 1073
 
10 cycrow 1074
	if ( fVersion >= 3.00f )
1075
		sFilename = sRest.tokens(" ", 3);
1076
	else if ( fVersion >= 2.00f )
1077
		sFilename = sRest.tokens(" ", 2);
1078
	else
1079
		sFilename = sRest;
1080
 
1081
	if ( sFilename.isin("<br>") ) {
1082
		sFilename = sFilename.findReplace("<br>", "|");
1083
		if ( sFilename[0] == '|' ) {
1084
			sFilename = sFilename.token("|", 1);
1085
		}
1086
		else {
1087
			*pDir = sFilename.token("|", 1);
1088
			sFilename = sFilename.tokens("|", 2);
1089
		}
1090
	}
1091
 
1092
	return sFilename;
7 cycrow 1093
}
1094
 
10 cycrow 1095
unsigned char *CSpkFile::_convert_parseFile(const Utils::String &sCmd, const Utils::String &sRest, float fVersion, unsigned char *d)
7 cycrow 1096
{
10 cycrow 1097
	bool bShared = (sCmd.left(9) == "$$$Shared") ? true : false;
1098
	Utils::String sFile = sCmd.right(-3).left(-1);
1099
	Utils::String sEnd = this->_convert_fileEndString(sFile);
1100
	int iType = this->_convert_fileType(sFile);
1101
 
1102
	// convert the filename and directory
1103
	Utils::String dir, filename = _convert_parseFilename(sRest, fVersion, &dir);
1104
 
1105
	// get the size and time
1106
	long time = 0, size = 0;
1107
	if ( fVersion >= 2.00f ) time = sRest.token(" ", 1).toLong();
1108
	if ( fVersion >= 3.00f ) size = sRest.token(" ", 2).toLong();
1109
	bool binaryRead = (CFileIO(filename).CheckFileExtension("PCK")) ? true : false;
1110
	if ( sEnd.empty() ) binaryRead = true;
1111
 
1112
	C_File *file = new C_File ();
1113
 
50 cycrow 1114
	if ( bShared )	CLog::logf(CLog::Log_File, 2, "\tFound %s File (Shared): %s, Reading...", sFile.c_str(), filename.c_str() );
1115
	else			CLog::logf(CLog::Log_File, 2, "\tFound %s File: %s, Reading...", sFile.c_str(), filename.c_str() );
10 cycrow 1116
 
1117
	// read the data
1118
	if ( binaryRead )
1119
	{
1120
		file->ReadFromData ( (char *)d, size );
1121
		d += size;
1122
	}
1123
	else
1124
	{
14 cycrow 1125
		Utils::String readData;
10 cycrow 1126
		d = LineByLineRead ( d, sEnd, &readData );
14 cycrow 1127
		file->ReadFromData ( (char *)readData.c_str(), (long)readData.length() );
10 cycrow 1128
	}
1129
 
1130
	// setup the file
1131
	file->SetName ( filename );
1132
	file->SetFileType ( iType );
1133
	file->SetShared ( bShared );
1134
	file->SetCreationTime ( time );
1135
	if ( !dir.empty() )
1136
		file->SetDir ( dir );
1137
 
1138
	this->AddFile ( file );
1139
 
50 cycrow 1140
	CLog::logf(CLog::Log_File, 3, "Size: %s", file->GetDataSizeString().c_str() );
10 cycrow 1141
 
1142
	return d;
7 cycrow 1143
}
1144
 
9 cycrow 1145
CSpkFile *CSpkFile::convertFromOld(const Utils::String &sOldFilename)
1146
{
1147
	// check if the old file is actually in an old format
10 cycrow 1148
	int ret = CBaseFile::CheckFile ( sOldFilename );
1149
	if ( ret != SPKFILE_INVALID && ret != SPKFILE_OLD ) {
1150
		return NULL;
1151
 	}
1152
 
1153
	CSpkFile *pSpkFile = new CSpkFile();
1154
	if ( !pSpkFile->convertOld(sOldFilename) ) {
1155
		delete pSpkFile;
1156
		return NULL;
1157
	}
1158
 
1159
	return pSpkFile;
9 cycrow 1160
}
1161
 
8 cycrow 1162
bool CSpkFile::convertOld(const Utils::String &sOldFilename)
7 cycrow 1163
{
1164
	// check if the old file is actually in an old format
10 cycrow 1165
	int ret = CBaseFile::CheckFile ( sOldFilename );
1166
	if ( ret != SPKFILE_INVALID && ret != SPKFILE_OLD ) {
1167
		return false;
1168
 	}
1169
 
1170
	//uncomress the data
1171
	int len;
1172
	unsigned char *uncomprData = this->_convert_uncompressFile(sOldFilename, &len);
1173
 
1174
	// uncomressed failed
1175
	if ( !uncomprData ) {
50 cycrow 1176
		CLog::log(CLog::Log_IO, 1, "Error: Unable to uncompress the file");
10 cycrow 1177
		return false;
1178
	}
1179
 
1180
	// now we can read the data
1181
	unsigned char *d = uncomprData;
1182
	Utils::String str;
1183
 
1184
//	CMultiSpkFile *mspk = NULL;
1185
	//SMultiSpkFile *cur_mspk = NULL;
1186
 
1187
	int numscripts = 0, curscript = 0;
1188
	float fVersion = 1;
1189
 
50 cycrow 1190
	CLog::log(CLog::Log_IO, 1, "* Reading spk data...");
10 cycrow 1191
	while ( d )
1192
	{
1193
		// read the next line
1194
		d = str.readToEndOfLine(d);
1195
		if ( !d || d[0] == 0 ) {
1196
			break;
1197
		}
1198
		if ( str.empty() ) {
1199
			continue;
1200
		}
1201
 
1202
		Utils::String sCmd = str.token(" ", 1);
1203
 
1204
		//TODO: split this into CMultiSpkFile
1205
		/*
1206
		if ( first == "MultiPackage:" )
1207
			mspk = new CMultiSpkFile;
1208
		else if ( (first == "SelectScript:") && (mspk) )
1209
		{
1210
			mspk->AddFileEntry ( rest.GetToken ( 2, -1, ' ' ) + ".spk" );
1211
			++numscripts;
1212
		}
1213
		else if ( (str == "AllowSelection") && (mspk) )
1214
			mspk->SetSelection ( true );
1215
		else if ( str == "-- Start New Script --" )
1216
		{
1217
			if ( !mspk )
1218
			{
1219
				printf ( "Invalid file format, seems to be multi package file but isn't\n" );
1220
				CLEANUP
1221
				exit ( 0 );
1222
			}
1223
			cur_mspk = mspk->GetFileList()->Get ( curscript );
1224
			++curscript;
1225
			cur_mspk->pFile = new CSpkFile;
1226
			spkfile = (CSpkFile *)cur_mspk->pFile;
1227
		}
1228
		*/
1229
		Utils::String sRest = str.tokens(" ", 2);
1230
		if ( sCmd == "Packager:" ) {
1231
			fVersion = sRest;
50 cycrow 1232
			CLog::logf(CLog::Log_Read, 3, "\tPackager Version: %.2f", fVersion );
10 cycrow 1233
		}
1234
		else if ( sCmd == "Icon:" )
1235
		{
1236
			long size = sRest.token(" ", 1);
1237
			Utils::String ext = sRest.token(" ", 2);
1238
 
1239
			C_File *file = new C_File ();
1240
			file->ReadFromData ( (char *)d, size );
1241
 
1242
			d += size;
1243
 
1244
			this->SetIcon(file, ext);
1245
 
50 cycrow 1246
			CLog::logf(CLog::Log_File, 3, "\tIcon (%s) Size: %s", ext.c_str(), file->GetDataSizeString ().c_str() );
10 cycrow 1247
		}
1248
		else if ( sCmd.left(3) == "$$$" )
1249
			d = _convert_parseFile(sCmd, sRest, fVersion, d);
1250
		else {
1251
			this->_convert_parse(sCmd, sRest);
1252
		}
1253
	}
1254
 
50 cycrow 1255
	CLog::logf(CLog::Log_IO, 1, "* Reading spk data..." );
10 cycrow 1256
 
7 cycrow 1257
	return true;
1258
}