Newer
Older
Import / projects / LGN-IP3870 / t / new / ems.py
from utils import Parser

# Bitmap, Melody: 파일로 저장되는 Media 데이타를 나타내는 구조체

class Bitmap:
	def __init__(self, width, height, depth, data):
		self.width = width
		self.height = height
		self.depth = depth
		self.data = data

	def save(self, fname):
		header = chr(self.width) + chr(self.height) + chr(self.depth)
		f = open(fname, 'w')
		f.write(header)
		f.write(self.data)

	def get_raw_data(self):
		header = chr(self.width) + chr(self.height) + chr(self.depth)
		return  header + self.data

class Melody:
	def __init__(self, data):
		if len(data) > 1:
			self.predefined = False
			self.data = data
		else:
			self.predefined = True
			self.id = ord(data)

	def save(self, fname):
		# 단독 음악파일로 저장할때 호출
		fp = open(fname, 'w')
		if self.predefined:
			fp.write(chr(self.id))
		else:
			fp.write(self.data)

	def get_raw_data(self):
		# sms message를 저장할때 사용
		if self.predefined:
			return chr(self.id)
		return self.data

class Animation:
	def __init__(self, data):
		pass
	def save(self, fname):
		pass
	def get_raw_data(self):
		pass

def load_data(type, data):
	if type == 'Bitmap':
		width = ord(data[0])
		height = ord(data[1])
		depth = ord(data[2])
		return 'Bitmap', Bitmap(width, height, depth, data[3:])
	elif type == 'Melody':
		return 'Melody', Melody(data)
	elif type == 'Text':
		return 'Text', data
	elif type == 'Animation':
		return 'Animation', Animation(data)

class InfoElement(Parser):
	tag = ''
	def parse(self, data):
		Parser.__init__(self, data)
		self.pos = self.get_byte()

	def make_header(self):
		return self.tag + chr(self.size) + chr(self.pos)  + self.get_packet_data()

	def packet_len(self):
		pass

class TextFormatting(InfoElement):
	def __init__(self, data):
		InfoElement.__init__(self, data)
		self.formatting_len = self.get_byte()
		self.formatting_mode = self.get_byte()
		self.color = self.get_byte()

class PredefinedSound(InfoElement):
	type = 'Predefined Sound'
	size = 1 + 1
	tag = chr(0x0b)
	def __init__(self, data, raw_data=False):
		if raw_data:
			data = '' + chr(data) # sound id
		self.parse(data)

	def parse(self, data):
		InfoElement.parse(self, data)
		self.sound = self.get_byte()
		# Chimes high, Chimes low, Ding, TaDa,
		# Notify, Drum, Claps, FanFar,
		# Chord high, Chord low
	def get_packet_data(self):
		return chr(self.sound)

	def get_melody(self):
		return Melody(chr(self.sound))

class UserDefinedSound(InfoElement):
	type = 'User Defined Sound'
	tag = chr(0x0c)

	def __init__(self, data, raw_data=False):
		if raw_data:
			data = ' ' + data # pos
		self.parse(data)

	def parse(self, data):
		InfoElement.parse(self, data)
		self.data = data[1:]
		self.size = 1 + len(self.data)

	def get_packet_data(self):
		return self.data

	def get_melody(self):
		return Melody(self.data)

class PredefinedAnimation(InfoElement):
	type = 'Predefined Animation'
	size = 1 + 1
	tag = chr(0x0d)
	def parse(self, data):
		InfoElement.parse(self, data)
		self.animation = self.get_byte()
		# I am ironic, flrty
		# I am glad
		# I am sceptic
		# I am sad
		# WOW!
		# I am crying
		# I am winking
		# I am laughing
		# I am indifferent
		# In love/Kissing
		# I am confused
		# Tongue hanging out
		# I am angry
		# Wearing glasses
		# Devil
	def get_packet_data(self):
		return chr(self.animation)

class LargeAnimation(InfoElement):
	type = 'Large Animation'
	tag = chr(0x0e)
	def __init__(self, data):
		InfoElement.__init__(self, data)

	def parse(self, data):
		self.data = data
		self.size = 1 + len(data)

	def get_packet_data(self):
		return self.data

class SmallAnimation(InfoElement):
	type = 'Small Animation'
	tag = chr(0x0f)
	def __init__(self, data):
		InfoElement.__init__(self, data)
	def parse(self, data):
		self.data = data
		self.size = 1 + len(data)

	def get_packet_data(self):
		return self.data

class Picture(InfoElement):
	def __init__(self, w, h, data):
		self.width = w
		self.height = h
		self.data = data
		if w == 32 and h == 32:
			self.type = 'Large Picture'
			self.size = 1 + 32 * 32 / 8
			self.tag = chr(0x10)
		elif w == 16 and h == 16:
			self.type = 'Small Picture'
			self.size = 1 + 16 * 16 / 8
			self.tag = chr(0x11)
		else:
			self.type = 'Variable Picture'
			self.size = 1 + 2 + w * h / 8
			self.tag = chr(0x12)

	def get_packet_data(self):
		if self.type == 'Variable Picture':
			return chr(self.width) + chr(self.height) + self.data
		return self.data

	def get_bitmap(self):
		return Bitmap(self.width, self.height, 1, self.data)

def LargePicture(data):
	pos = ord(data[0])
	pic= Picture(32, 32, data[1:])
	pic.pos = pos
	return pic

def SmallPicture(data):
	pos = ord(data[0])
	pic = Picture(16, 16, data[1:])
	pic.pos = pos
	return pic

def VariablePicture(data):
	p = Parser(data)
	pos = p.get_byte()
	w = p.get_byte()
	h = p.get_byte()
	pic = Picture(w, h, data[3:])
	pic.pos = pos
	return pic