Subversion Repositories spk

Rev

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

Rev 88 Rev 96
Line 1493... Line 1493...
1493
}
1493
}
1494
 
1494
 
1495
unsigned char *UnPCKData ( unsigned char *data, size_t datasize, size_t *len ) { return UnPCKData(data, datasize, len, IsDataPCK(data, datasize)); }
1495
unsigned char *UnPCKData ( unsigned char *data, size_t datasize, size_t *len ) { return UnPCKData(data, datasize, len, IsDataPCK(data, datasize)); }
1496
unsigned char *UnPCKData ( unsigned char *data, size_t datasize, size_t *len, bool nocrypt )
1496
unsigned char *UnPCKData ( unsigned char *data, size_t datasize, size_t *len, bool nocrypt )
1497
{
1497
{
1498
	//IsDataPCK(data, datasize)
1498
	bool isPCK = IsDataPCK(data, datasize);
-
 
1499
 
-
 
1500
	unsigned char *newData = data;
-
 
1501
	unsigned char *tempData = NULL;
-
 
1502
 
1499
	if ( nocrypt )
1503
	if ( nocrypt )
1500
	{
1504
	{
-
 
1505
		tempData = new unsigned char[datasize]; 
-
 
1506
		newData = tempData;
-
 
1507
		memcpy(newData, data, datasize);
1501
		unsigned char magic = data[0] ^ 0xC8;
1508
		unsigned char magic = newData[0] ^ 0xC8;
1502
 
1509
 
1503
		for ( size_t i = 1; i < datasize; i++ )
1510
		for ( size_t i = 1; i < datasize; i++ )
1504
			data[i] ^= magic;
1511
			newData[i] ^= magic;
1505
		++data;
1512
		++newData;
1506
		--datasize;
1513
		--datasize;
1507
	}
1514
	}
1508
 
1515
 
1509
	// create data buffer
1516
	// create data buffer
1510
	size_t *uncomprLenSize = (size_t*)(data + (datasize - 4));
1517
	size_t *uncomprLenSize = (size_t*)(newData + (datasize - 4));
1511
	unsigned long uncomprLen = (unsigned long)*uncomprLenSize;
1518
	unsigned long uncomprLen = (unsigned long)*uncomprLenSize;
1512
	if ( uncomprLen > (datasize * 100) )
1519
	if ( uncomprLen > (datasize * 100) )
1513
	{
1520
	{
-
 
1521
		if ( tempData ) delete []tempData;
1514
		*len = 0;
1522
		*len = 0;
1515
		return NULL;
1523
		return NULL;
1516
	}
1524
	}
1517
	unsigned char *uncompr = new unsigned char[uncomprLen + 1];
1525
	unsigned char *uncompr = new unsigned char[uncomprLen + 1];
1518
	if ( !uncompr ) 
1526
	if ( !uncompr ) {
-
 
1527
		if ( tempData ) delete []tempData;
1519
		return NULL;
1528
		return NULL;
-
 
1529
	}
1520
	memset ( uncompr, 0, sizeof(uncompr) );
1530
	memset ( uncompr, 0, sizeof(uncompr) );
1521
 
1531
 
1522
 
1532
 
1523
	// find header size
1533
	// find header size
1524
	unsigned char *buf = data + PCKHEADERSIZE;
1534
	unsigned char *buf = newData + PCKHEADERSIZE;
1525
 
1535
 
1526
//	buf = data + (6 + sizeof(time_t));
1536
//	buf = data + (6 + sizeof(time_t));
1527
	char flag = data[3];
1537
	char flag = newData[3];
1528
 
1538
 
1529
	if ( flag & GZ_FLAG_EXTRA )
1539
	if ( flag & GZ_FLAG_EXTRA )
1530
	{
1540
	{
1531
		size_t xlen = *((short int*)(buf));
1541
		size_t xlen = *((short int*)(buf));
1532
		buf += xlen;
1542
		buf += xlen;
Line 1542... Line 1552...
1542
		char *comment = (char*)(buf);
1552
		char *comment = (char*)(buf);
1543
		buf += strlen(comment) + 1;
1553
		buf += strlen(comment) + 1;
1544
	}
1554
	}
1545
	if ( flag & GZ_FLAG_HCRC )
1555
	if ( flag & GZ_FLAG_HCRC )
1546
		buf += 2;
1556
		buf += 2;
1547
	long bufSize = (long)(datasize - (buf-data) - 8);
1557
	long bufSize = (long)(datasize - (buf-newData) - 8);
1548
 
1558
 
1549
	int err = uncompress2 ( uncompr, &uncomprLen, buf, bufSize );
1559
	int err = uncompress2 ( uncompr, &uncomprLen, buf, bufSize );
1550
	if ( err != Z_OK )
1560
	if ( err != Z_OK )
1551
	{
1561
	{
-
 
1562
		if ( tempData ) delete []tempData;
1552
		delete uncompr;
1563
		delete uncompr;
1553
		*len = 0;
1564
		*len = 0;
1554
		return NULL;
1565
		return NULL;
1555
	}
1566
	}
1556
 
1567
 
1557
	*len = uncomprLen;
1568
	*len = uncomprLen;
1558
	uncompr[uncomprLen] = '\0';
1569
	uncompr[uncomprLen] = '\0';
-
 
1570
	if ( tempData ) delete []tempData;
1559
	return uncompr;
1571
	return uncompr;
1560
}
1572
}
1561
 
1573
 
1562
bool IsDataPCK ( const unsigned char *data, size_t size )
1574
bool IsDataPCK ( const unsigned char *data, size_t size )
1563
{
1575
{