from isfencodings import *
import os.path
from array import array


class ISF( object ):

	def decode(self, filename):
		size = os.path.getsize(filename)
		f = open(filename,'rb')
		data = array('B')
		data.read(f,size)
		f.close()

		location = 2
		while location < data.buffer_info()[1]:
			tag, location = dec_mbuint32(data, location)
			if tag == 0:
				#INK_SPACE_RECT
				print 'INK_SPACE_RECT'
			elif tag == 1:
				#GUID_TABLE
				payload_size, location = dec_mbuint64(data, location)
				location = location + payload_size
				print 'GUID_TABLE size', payload_size
			elif tag == 2:
				#DRAW_ATTRS_TABLE
				payload_size, location = dec_mbuint64(data, location)
				location = location + payload_size
				print 'DRAW_ATTRS_TABLE size', payload_size
			elif tag == 3:
				#DRAW_ATTRS_BLOCK
				payload_size, location = dec_mbuint64(data, location)
				location = location + payload_size
				print 'DRAW_ATTRS_BLOCK size', payload_size
			elif tag == 4:
				#STROKE_DESC_TABLE
				payload_size, location = dec_mbuint64(data, location)
				location = location + payload_size
				print 'STROKE_DESC_TABLE size', payload_size
			elif tag == 5:
				#STROKE_DESC_BLOCK
				payload_size, location = dec_mbuint64(data, location)
				location = location + payload_size
				print 'STROKE_DESC_BLOCK size', payload_size
			elif tag == 6:
				#BUTTONS
				print 'BUTTONS'
			elif tag == 7:
				#NO_X
				print 'NO_X'
			elif tag == 8:
				#NO_Y
				print 'NO_Y'
			elif tag == 9:
				#DIDX
				self.draw_attrs_index, location = dec_mbuint32(data, location)
				print 'DIDX', self.draw_attrs_index
			elif tag == 10:
				#STROKE
				payload_size, location = dec_mbuint64(data, location)
				print 'STROKE payload', payload_size
				#packet data for GUID_X and then GUID_Y
				stroke_data = data[location:location+payload_size]
				guid_x, guid_y = dec_packet(stroke_data)
				location = location + payload_size
			elif tag == 11:
				#STROKE_PROPERTY_LIST
				print 'STROKE_PROPERTY_LIST'
			elif tag == 12:
				#POINT_PROPERTY
				print 'POINT_PROPERTY'
			elif tag == 13:
				#SIDX
				self.stroke_desc_index, location = dec_mbuint32(data, location)
				print 'SIDX', self.stroke_desc_index
			elif tag == 14:
				#COMPRESSION_HEADER
				print 'COMPRESSION_HEADER'
			elif tag == 15:
				#TRANSFORM_TABLE
				payload_size, location = dec_mbuint64(data, location)
				location = location + payload_size
				print 'TRANSFORM_TABLE size', payload_size
			elif tag == 16:
				#TRANSFORM
				location += 24
				print 'TRANSFORM'
			elif tag == 17:
				#TRANSFORM_ISOTROPIC_SCALE
				location += 4
				print 'TRANSFORM_ISOTROPIC_SCALE'
			elif tag == 18:
				#TRANSFORM_ANISOTROPIC_SCALE
				location += 8
				print 'TRANSFORM_ANISOTROPIC_SCALE'
			elif tag == 19:
				#TRANSFORM_ROTATE
				data, location = dec_mbuint32(data, location)
				print 'TRANSFORM_ROTATE', data
			elif tag == 20:
				#TRANSFORM_TRANSLATE
				location += 8
				print 'TRANSFORM_TRANSLATE'
			elif tag == 21:
				#TRANSFORM_SCALE_AND_TRANSLATE
				location += 16
				print 'TRANSFORM_SCALE_AND_TRANSLATE'
			elif tag == 22:
				#TRANSFORM_QUAD
				location += 24
				print 'TRANSFORM_QUAD'
			elif tag == 23:
				#TIDX
				self.transform_table_index, location = dec_mbuint32(data, location)
				print 'TIDX', self.transform_table_index
			elif tag == 24:
				#METRIC_TABLE
				payload_size, location = dec_mbuint64(data, location)
				location = location + payload_size
				print 'METRIC_TABLE size', payload_size
			elif tag == 25:
				#METRIC_BLOCK
				GUID, location = dec_mbuint32(data, location)
				payload_size, location = dec_mbuint32(data, location)
				location = location + payload_size
				print 'METRIC_BLOCK size', payload_size
			elif tag == 26:
				#MIDX
				self.metric_block_index, location = dec_mbuint32(data, location)
				print 'MIDX', self.metric_block_index
			elif tag == 27:
				#MANTISSA
				print 'MANTISSA'
			elif tag == 28:
				#PERSISTENT_FORMAT
				payload_size, location = dec_mbuint64(data, location)
				self.persistent_format, location = dec_mbuint32(data, location)
				print 'PERSISTENT_FORMAT:', self.persistent_format
			elif tag == 29:
				#HIMETRIC_SIZE
				payload_size, location = dec_mbuint64(data, location)
				self.width, location = dec_mbsint32(data, location)
				self.height, location = dec_mbsint32(data, location)
				print 'HIMETRIC_SIZE:', self.width, 'x', self.height
			elif tag == 30:
				#STROKE_IDS
				payload_size, location = dec_mbuint64(data, location)
				location = location + payload_size
				print 'STROKE_IDS size', payload_size
		return

if __name__ == '__main__':
	print 'Decoding ''word.isf'''
	thing = ISF()
	ISF.decode(thing,'word.isf')

