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