Subversion Repositories spk

Rev

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

Rev 52 Rev 53
Line 593... Line 593...
593
	// check file extenstion
593
	// check file extenstion
594
	if ( (ext.Compare("pck")) || (CheckPCK()) )
594
	if ( (ext.Compare("pck")) || (CheckPCK()) )
595
	{
595
	{
596
		size_t size = 0;
596
		size_t size = 0;
597
		unsigned char *data = UnPCKFile ( &size );
597
		unsigned char *data = UnPCKFile ( &size );
598
		if ( (data) && (size) )
598
		if ( (data) && (size) ) {
599
			return ::ReadSignedFromData ( data, (long)size );
599
			bool ret = ::ReadSignedFromData ( data, (long)size );
-
 
600
			//delete data;
-
 
601
			return ret;
-
 
602
		}
600
	}
603
	}
601
	else if ( (m_sData) && (m_iDataCompression == SPKCOMPRESS_NONE) )
604
	else if ( (m_sData) && (m_iDataCompression == SPKCOMPRESS_NONE) )
602
		return ::ReadSignedFromData ( m_sData, m_lDataSize );
605
		return ::ReadSignedFromData ( m_sData, m_lDataSize );
603
	else
606
	else
604
	{
607
	{
605
		FILE *id = fopen(file.c_str(), "rb");
-
 
606
		if ( id )
-
 
607
		{
-
 
608
			CyString sRead;
-
 
609
			char read[21];
608
		unsigned char pData[5001];
610
 
609
 
611
			fseek(id, 0, SEEK_END);
-
 
612
			int endPos = ftell(id);
610
		CFileIO File(file);
613
 
-
 
614
			int pos = endPos;
-
 
615
			int attempts = 100;
-
 
616
			// move to end of the file
611
		int iAmount = (File.fileSize() > 5000) ? 5000 : File.fileSize();
617
			while ( true )
612
		if ( File.startRead() ) {
618
			{
-
 
619
				// read blocks of 20 backwards
-
 
620
				pos -= 20;
-
 
621
				if ( pos < 0 )
-
 
622
					pos = 0;
-
 
623
 
-
 
624
				fseek(id, pos, SEEK_SET);
613
			File.seekStart(File.fileSize() - iAmount);
625
				fread(read, sizeof(char), 20, id);
614
			if ( File.read(pData, iAmount, true) ) {
626
				read[20] = '\0';
-
 
627
				sRead = CyString(read) + sRead;
-
 
628
				// find code array
-
 
629
				if ( sRead.FindPos("codearray") != -1 )
615
				return ::ReadSignedFromData(pData, iAmount);
630
					break;
-
 
631
				if ( pos <= 2 )
-
 
632
					break;
-
 
633
				--attempts;
-
 
634
				if ( attempts <= 0 ) break;
-
 
635
			}
616
			}
636
 
-
 
637
			fclose(id);
-
 
638
 
-
 
639
			// now check the find read
-
 
640
			if ( sRead.FindPos("signed") != -1 )
-
 
641
				return true;
-
 
642
		}
617
		}
643
	}
618
	}
644
 
619
 
645
	return false;
620
	return false;
646
}
621
}
Line 1727... Line 1702...
1727
 
1702
 
1728
}
1703
}
1729
 
1704
 
1730
bool ReadSignedFromData ( unsigned char *data, long size )
1705
bool ReadSignedFromData ( unsigned char *data, long size )
1731
{
1706
{
1732
	if ( IsDataPCK ( data, size ) )
1707
	bool ret = false;
1733
	{
1708
 
-
 
1709
	if ( IsDataPCK ( data, size ) ) {
1734
		size_t unpckSize = 0;
1710
		size_t unpckSize = 0;
1735
		unsigned char *unpckData = UnPCKData ( data, size, &unpckSize, false );
1711
		unsigned char *unpckData = UnPCKData ( data, size, &unpckSize, false );
1736
		if ( (unpckData) && (unpckSize) )
1712
		if ( (unpckData) && (unpckSize) ) {
1737
			return ReadSignedFromData ( unpckData, (long)unpckSize );
1713
			ret = ReadSignedFromData ( unpckData, (long)unpckSize );
-
 
1714
			delete unpckData;
-
 
1715
		}
1738
		return false;
1716
		return ret;
1739
	}
1717
	}
1740
 
1718
 
-
 
1719
	char tag[10000];
-
 
1720
 
1741
	// work backwards
1721
	// work backwards
1742
	int pos = size - 1;
1722
	int pos = size - 1;
1743
	int max = size - 5000;
1723
	int max = size - 5000;
1744
	if ( max < 0 ) max = 0;
1724
	if ( max < 0 ) max = 0;
1745
	// find the first tage
1725
	// find the first tage
1746
	while ( pos > max )
1726
	while ( pos > max ) {
1747
	{
-
 
1748
		while ( data[pos] != '>' && pos > 0 )
1727
		while ( data[pos] != '>' && pos > max ) pos--;
1749
			pos--;
1728
		if ( data[pos] != '>' ) break;
1750
 
1729
 
1751
		char tag[10000];
-
 
1752
		bool checked = false;
1730
		// now find the front
1753
		if ( data[pos] == '>' )
-
 
1754
		{
-
 
1755
			int pos2 = pos - 1;
1731
		int pos2 = pos - 1;
1756
			// now find the front
-
 
1757
			while ( data[pos2] != '<' && pos2 > max )
1732
		while ( data[pos2] != '<' && pos2 > max ) pos2--;
1758
				pos2--;
1733
		if ( data[pos2] != '<' ) break;
1759
 
1734
 
1760
			// now get the tag
-
 
1761
			if ( data[pos2] == '<' )
-
 
1762
			{
-
 
1763
				checked = true;
-
 
1764
				memcpy(tag, data + pos2, pos - pos2);
1735
		memcpy(tag, data + pos2, pos - pos2);
1765
				tag[pos - pos2] = '\0';
1736
		tag[pos - pos2] = '\0';
1766
 
1737
 
1767
				// check if tag is signed
-
 
1768
				CyString sTag(tag);
1738
		Utils::String sTag(tag);
1769
 
-
 
1770
				if ( sTag.Compare("</signature") || sTag.Compare("<signature") )
1739
		if ( sTag.Compare("</signature") || sTag.Compare("<signature") ) return true;
1771
					return true;
-
 
1772
 
-
 
1773
				// check if tag is codearray
-
 
1774
				if ( sTag.Compare("</codearray") || sTag.Compare("<codearray") )
1740
		if ( sTag.Compare("</codearray") || sTag.Compare("<codearray") ) return false;
1775
					return false;
-
 
1776
 
-
 
1777
				pos = pos2;
1741
		pos = pos2 - 1;
1778
			}
-
 
1779
 
-
 
1780
			--pos;
-
 
1781
		}
-
 
1782
 
-
 
1783
		if ( !checked )
-
 
1784
			break;
-
 
1785
	}
1742
	}
1786
 
1743
 
1787
	return false;
1744
	return false;
1788
}
1745
}
1789
 
1746