from utils import Parser
import utils
import ems, runtime
import config
from mms_net_define import *
from mms_net_pdu import Get_CurrentDate
import mmsconfig
#Message Type Indicator
MTI_DELIVER = MTI_DELIVER_REPORT = 0x0
MTI_SUBMIT = MTI_SUBMIT_REPORT = 0x1
MTI_COMMAND = MTI_STATUS_REPORT = 0x2
#port
# Multipart Message: 0x158A
# Caller Line Identification Icon Message - CLI Logo Message: 0x1583
# Operator Logo Reader: 0x1582
#
# PID Protocol-Identifier
# OA Originating-Address
# DA Destination-Address
# MR Message-Reference
# SRR Status-Report-Request
# SRI Status-Report-Indication
# VPF Validity-Period-Format
# MMS More-Messages-to-Send
# DCS Data-Coding-Scheme
# VP Validity-Period
# DT Discharge-Time
# RA Recipient-Address
# ST Status
# CDL Command-Data-Length
# CD Command-Data
# FCS Failure-Cause
# RP Reply-Path
# MN Message-Number
# CT Command-Type
# UDL User-Data-Length
# UDHI User-Data-Header-Indicator
# UD User-Data
# PI Parameter-Indicator
# SRQ Status-Report-Qualifier
# RD Reject-Duplicates
# SCTS Service-Centre-Time-Stamp
MTI_SHIFT = 0
MTI_MASK = 3
MMS_SHIFT = 2
MMS_MASK = 1
RD_SHIFT = 2
RD_MASK = 1
VPF_SHIFT = 3
VPF_MASK = 3
SRR_SHIFT = 5
SRR_MASK = 1
SRI_SHIFT = 5
SRI_MASK = 1
UDHI_SHIFT = 6
UDHI_MASK = 1
RP_SHIFT = 7
RP_MASK = 1
# RP : 0 no reply path
# 1 has reply path
#
# PID 0x20: telematic interworking
PID_NORMAL = 0x00
PID_FAX = 0x02 | 0x20
PID_EMAIL = 0x12 | 0x20
ENCODING_7, ENCODING_8, ENCODING_UCS2 = range(3)
class MultipartMessage:
# smart messaging spec: 3-31
# version, item-type
# length = 2 octet
# item type: 00 -> length, iso-8859-1
# 01 -> length unicode
# 02 -> length ota bitmap
# 03 -> length ring tone
# 04 -> length profile name
# 05 -> reserved
# 06 -> length screensaver
pass
def encode_semi_octet(octet):
enc = ''
i = 0
while i < len(octet) - 1:
enc += chr(octet[i] + octet[i+1] * 16)
i += 2
if i < len(octet):
enc += chr(octet[i] + 0xF * 16)
return enc
def decode_semi_octet(enc):
enc = [ord(x) for x in enc]
dec = ''
for x in enc:
dec += chr((x & 0xF) + ord('0'))
if (x >> 4) != 0xF:
dec += chr((x >> 4) + ord('0'))
return dec
def decode_scts(ts):
def decode(octet):
return (ord(octet) & 0xF) * 10 + (ord(octet) >> 4)
year = decode(ts[0])
mon = decode(ts[1])
day = decode(ts[2])
hour = decode(ts[3])
min = decode(ts[4])
sec = decode(ts[5])
tz = decode(ts[6])
return year, mon, day, hour, min, sec, tz
### START(060201) : Replaced by Ryoo Ho Chang ###
special_semi_octet_encode = (42, 35, 97, 98, 99)
special_semi_octet_decode = (10, 11, 12, 13, 14)
def encode_address(addr):
addr_type = 0x81
addr_len = len(addr)
addr_header = "%c%c" % (addr_len, addr_type)
addr = [ord(x) for x in addr]
addr_encode = ''
first_half_octet = 0
second_half_octet = 0
print 'addr = ', addr
i = 0
while i < len(addr) - 1:
if addr[i] in special_semi_octet_encode:
if addr[i] == 42: # '*'
second_half_octet = 10
elif addr[i] == 35: # '#'
second_half_octet = 11
elif addr[i] == 97: # 'a'
second_half_octet = 12
elif addr[i] == 98: # 'b'
second_half_octet = 13
elif addr[i] == 99: # 'c'
second_half_octet = 14
else:
second_half_octet = addr[i] - ord('0')
if addr[i+1] in special_semi_octet_encode:
if addr[i+1] == 42: # '*':
first_half_octet = 10
elif addr[i+1] == 35: # '#':
first_half_octet = 11
elif addr[i+1] == 97: # 'a':
first_half_octet = 12
elif addr[i+1] == 98: # 'b':
first_half_octet = 13
elif addr[i+1] == 99: # 'c':
first_half_octet = 14
else:
first_half_octet = addr[i+1] - ord('0')
addr_encode += chr(first_half_octet*16 + second_half_octet)
i += 2
if i < len(addr):
if addr[i] in special_semi_octet_encode:
if addr[i] == ord('*'):
last_half_octet = 10
elif addr[i] == '#':
last_half_octet = 11
elif addr[i] == 'a':
last_half_octet = 12
elif addr[i] == 'b':
last_half_octet = 13
elif addr[i] == 'c':
last_half_octet = 14
else:
last_half_octet = addr[i] - ord('0')
addr_encode += chr(0xF*16 + last_half_octet)
return addr_header + addr_encode
def decode_addr(addr_len, addr_type, addr_encode):
addr_encode = [ord(x) for x in addr_encode]
decoded_addr = ''
first_half_octet = 0
second_half_octet = 0
for x in addr_encode:
first_half_octet = x & 0xF
second_half_octet = x >> 4
if first_half_octet in special_semi_octet_decode:
if first_half_octet == 10:
decoded_addr += '*'
elif first_half_octet == 11:
decoded_addr += '#'
elif first_half_octet == 12:
decoded_addr += 'a'
elif first_half_octet == 13:
decoded_addr += 'b'
elif first_half_octet == 14:
decoded_addr += 'c'
else:
decoded_addr += chr(first_half_octet + ord('0'))
if second_half_octet in special_semi_octet_decode:
if second_half_octet == 10:
decoded_addr += '*'
elif second_half_octet == 11:
decoded_addr += '#'
elif second_half_octet == 12:
decoded_addr += 'a'
elif second_half_octet == 13:
decoded_addr += 'b'
elif second_half_octet == 14:
decoded_addr += 'c'
else:
if second_half_octet != 0xF:
decoded_addr += chr(second_half_octet + ord('0'))
return decoded_addr
### END(060201) ###
# DCS: 0xF1
# DCS & 0xC0 -> 0: general data coding indication
# DCS & 0x0C -> 0(7bit alphabet), 1(8 bit), 2(ucs2)
# DCS & 0x20 -> 1 compressed
# DCS & 0xF0 -> 0xF0: DCS & 0x4 -> 0(7bit alphabet), 1(8 bit)
# , 0x -> 7bit alphabet
#DCS_7BIT = 0xF0
DCS_7BIT = 0x00
# VPF
# User Data header: UDHL, IEI, IEIDL, IED, IEI, IEIDL, IED,
# VPF: 2 -> relative, 1 -> enhanced, 3 -> absolute
import status, modem
import emssplit
import gsm7
import mms_net_define
class SmsInfoHandler:
def __init__(self, info=None):
self.filename = ''
self.messageTime = ''
self.isRead = mms_net_define.NO
self.sender = ''
self.receiver = ''
self.smsMessageType = ''
self.smsSubject = ''
self.replyTo = ''
self.sipSubject = ''
if info:
self.saveInfo(info)
def printVar(self, number):
print '>>>> SmsInfoHandler ====> ', number
print 'self.filename = ', self.filename
print 'self.messageTime = ', self.messageTime
print 'self.isRead = ', self.isRead
print 'self.sender = ', self.sender
print 'self.receiver = ', self.receiver
print 'self.smsMessageType = ', self.smsMessageType
print 'self.smsSubject = ', self.smsSubject
print 'self.sipSubject = ', self.sipSubject
def getSipSubject(self):
return self.sipSubject
def setSipSubject(self, sipSubject):
self.sipSubject = sipSubject
def getReplyTo(self):
return self.replyTo
def setReplyTo(self, replyTo):
self.replyTo = replyTo
def getFilename(self):
return self.filename
def setFilename(self, filename):
self.filename = filename
def getMessageTime(self):
return self.messageTime
def getMessageTimeList(self):
if self.messageTime:
year = self.messageTime[:4]
month = self.messageTime[4:6]
date = self.messageTime[6:8]
hour = self.messageTime[8:10]
minute = self.messageTime[10:12]
second = self.messageTime[12:14]
return (year, month, date, hour, minute, second)
else:
return self.messageTime
def setMessageTime(self, messageTime):
self.messageTime = messageTime
def getIsRead(self):
return self.isRead
def setIsRead(self, isRead):
self.isRead = isRead
def getSender(self): # == mmsFrom
return self.sender
def setSender(self, sender):
self.sender = sender
def getReceiver(self):
return self.receiver
def setReceiver(self, receiver):
self.receiver = receiver
def getSmsMessageType(self):
return self.smsMessageType
def setSmsMessageType(self, smsMessageType):
self.smsMessageType = smsMessageType
def getSmsSubject(self):
return self.smsSubject
def setSmsSubject(self, smsSubject):
self.smsSubject = smsSubject
def makeTimeStamp(self):
import time
now = time.localtime()
now = now[:6]
now = '%04d%02d%02d%02d%02d%02d' % now
return now
def makeInfoList(self):
return (self.filename, self.messageTime, self.isRead, self.sender, self.replyTo, self.receiver, self.smsMessageType, self.smsSubject)
def saveInfo(self, info):
self.filename, self.messageTime, self.isRead, self.sender, self.replyTo, self.receiver, self.smsMessageType, self.smsSubject = info
def getBoxType(self):
import smsmanager
if self.filename:
if self.filename.find('received') > 0:
return smsmanager.IN_BOX
elif self.filename.find('saved') > 0:
return smsmanager.OUT_BOX
elif self.filename.find('draft') > 0:
return smsmanager.DRAFT_BOX
elif self.filename.find('sent') > 0:
return smsmanager.SENT_BOX
else:
print 'ERROR : getBoxType'
def copyTempToNormal(self, path, tempFile=None):
if not tempFile:
print 'ERROR in SAVE'
return
import os
i = 0
while True:
filename = path + '%08d' % i
if not os.path.exists(filename):
break
i += 1
continue
normalFile = os.path.normpath(filename)
self.filename = normalFile
os.rename(tempFile, normalFile)
class SmsSipHandler:
def __init__(self, sender='', sipContentType='', sipSubject='', sipAbsMessagePath='', sipReplyTo=''):
# hcryoo : [20071217_1] : KT ISMC 지원
self.sipIsmcHostname = '1549'
self.sipIsmcDomain = 'ismc.ann.com'
self.targetUserName = ''
self.targetHostName = ''
# hcryoo : [20071217_1] : KT ISMC 지원==
self.sipContentType = sipContentType
self.sipSubject = sipSubject
self.sipAbsMessagePath = sipAbsMessagePath
self.sipMessageString = ''
# hcryoo : [20071217_1] : KT ISMC 지원
self.sipReplyTo = sipReplyTo
# hcryoo : [20071217_1] : KT ISMC 지원==
self.senderName = sender
def printVar(self, number):
print '>>>> SmsSipHandler ====> ', number
print 'self.targetUserName = ', self.targetUserName
print 'self.targetHostName = ', self.targetHostName
print 'self.sipContentType = ', self.sipContentType
print 'self.sipSubject = ', self.sipSubject
print 'self.sipAbsMessagePath = ', self.sipAbsMessagePath
print 'self.sipReplyTo = ', self.sipReplyTo
# SIP
# hcryoo : [20071217_1] : KT ISMC 지원
def getSipIsmcHostname(self):
return self.sipIsmcHostname
def setSipIsmcHostname(self, sipIsmcHostname):
self.sipIsmcHostname = sipIsmcHostname
def getSipIsmcDomain(self):
return self.sipIsmcDomain
def setSipIsmcDomain(self, sipIsmcDomain):
self.sipIsmcDomain = sipIsmcDomain
def getTargetUserName(self):
return self.targetUserName
# hcryoo : [20071217_1] : KT ISMC 지원==
def setTargetUserName(self, targetUserName):
self.targetUserName = targetUserName
def getTargetHostName(self):
return self.targetHostName
def setTargetHostName(self, targetHostName):
self.targetHostName = targetHostName
def getTargetFullName(self):
if self.targetUserName:
return self.targetUserName + '@' + self.targetHostName
else:
return ''
def getSipContentType(self):
return self.sipContentType
def setSipContentType(self, sipContentType):
self.sipContentType = sipContentType
def getSipSubject(self):
return self.sipSubject
def setSipSubject(self, sipSubject):
self.sipSubject = sipSubject
def getSipAbsMessagePath(self):
return self.sipAbsMessagePath
def setSipAbsMessagePath(self, sipAbsMessagePath):
self.sipAbsMessagePath = sipAbsMessagePath
# hcryoo : [20071217_1] : KT ISMC 지원
def getSipReplyTo(self):
return self.sipReplyTo
def setSipReplyTo(self, sipReplyTo):
self.sipReplyTo = sipReplyTo
# hcryoo : [20071217_1] : KT ISMC 지원==
def getSenderName(self):
return self.senderName
def setSenderName(self, senderName):
self.senderName = senderName
def getSipDataAll(self):
return (self.targetUserName, self.targetHostName, self.sipContentType, \
self.sipSubject, self.sipAbsMessagePath, self.sipReplyTo, self.senderName)
def getSipMessageString(self):
fileHandle = open(self.sipAbsMessagePath, 'r')
self.sipMessageString = fileHandle.read()
fileHandle.close()
return self.sipMessageString
# hcryoo : [20071217_1] : KT ISMC 지원
class IsmcMessage_Receive(SmsSipHandler):
def __init__(self, smsSipHandler):
SmsSipHandler.__init__(self)
self.targetUserName, self.targetHostName, self.sipContentType, \
self.sipSubject, self.sipAbsMessagePath, self.sipReplyTo, self.senderName = smsSipHandler.getSipDataAll()
self.ismcMessageHandler = IsmcMessageHandler()
self.mmsMessageHandler.parse(self.sipAbsMessagePath)
self.mmsMessageHandler.mmsHeaderHandler.printVar(1)
def discard(self):
import os
filePath = self.getSipAbsMessagePath()
os.remove(filePath)
# hcryoo : [20071217_1] : KT ISMC 지원==
class SmsMessage_Receive(SmsSipHandler):
def __init__(self, smsSipHandler):
SmsSipHandler.__init__(self)
self.targetUserName, self.targetHostName, self.sipContentType, \
self.sipSubject, self.sipAbsMessagePath, self.senderName = smsSipHandler.getSipDataAll()
self.mmsMessageHandler = MmsMessageHandler()
self.mmsMessageHandler.parse(self.sipAbsMessagePath)
self.mmsMessageHandler.mmsHeaderHandler.printVar(1)
def discard(self):
import os
filePath = self.getSipAbsMessagePath()
os.remove(filePath)
# hcryoo : [20071217_1] : KT ISMC 지원
class SmsIsmcMessage_Send(SmsSipHandler):
def __init__(self, message):
SmsSipHandler.__init__(self)
self.ismcMessageHandler = message
def makeSipBodyFile(self):
filePath = self.ismcMessageHandler.makeIsmcBody(True)
self.setSipAbsMessagePath(filePath)
def send(self):
runtime.vdciapp.send_mesg(code1='m', code2='m', \
mesg1=self.getTargetUserName(), \
mesg2=self.getTargetHostName(), \
#mesg3=self.getSipContentType(), \
#mesg4=self.getSipSubject(), \
mesg5=self.getSipMessageString(), \
mesg6=self.getSipReplyTo(),\
mesg7=self.getSipIsmcHostname(), \
mesg8=self.getSipIsmcDomain())
def discard(self):
import os
filePath = self.getSipAbsMessagePath()
os.remove(filePath)
# hcryoo : [20071217_1] : KT ISMC 지원==
class SmsMessage_Send(SmsSipHandler):
def __init__(self, message):
SmsSipHandler.__init__(self)
self.mmsMessageHandler = message
self.headerList = []
def addHeaderName(self, headerName):
self.headerList.append(headerName)
def setHeaderList(self, headerList):
self.headerList = headerList
def makeSipBodyFile(self):
filePath = self.mmsMessageHandler.makeMmsMessage(self.headerList)
self.setSipAbsMessagePath(filePath)
def send(self):
runtime.vdciapp.send_mesg(code1='m', code2='m', \
mesg1=self.getTargetUserName(), \
mesg2=self.getTargetHostName(), \
mesg3=self.getSipContentType(), \
mesg4=self.getSipSubject(), \
mesg5=self.getSipAbsMessagePath())
def discard(self):
import os
filePath = self.getSipAbsMessagePath()
os.remove(filePath)
class M_Notification_Ind_SMS(SmsMessage_Receive):
def __init__(self, smsSipHandler):
SmsMessage_Receive.__init__(self, smsSipHandler)
def isSuccess(self):
if self.mmsResponseStatus == 'Success':
return True
else:
return False
# hcryoo : [20071217_1] : KT ISMC 지원
class M_Send_Conf_SMS(SmsMessage_Receive):
def __init__(self, smsSipHandler):
SmsMessage_Receive.__init__(self, smsSipHandler)
self.discard()
def isSuccess(self):
if self.mmsMessageHandler.mmsHeaderHandler.getMmsResponseStatus() == '100':
return True
else:
return False
# hcryoo : [20071217_1] : KT ISMC 지원==
'''
class M_Send_Conf_SMS(SmsMessage_Receive):
def __init__(self, smsSipHandler):
SmsMessage_Receive.__init__(self, smsSipHandler)
self.discard()
def isSuccess(self):
if self.mmsMessageHandler.mmsHeaderHandler.getMmsResponseStatus() == '100':
return True
else:
return False
'''
# hcryoo : [20071217_1] : KT ISMC 지원
class M_NotifyResp_Ind_SMS(SmsIsmcMessage_Send):
def __init__(self, message):
SmsIsmcMessage_Send .__init__(self, message)
# hcryoo : [20071217_1] : KT ISMC 지원==
'''
class M_NotifyResp_Ind_SMS(SmsMessage_Send):
def __init__(self, message):
SmsMessage_Send .__init__(self, message)
header = [X_Mms_Message_Type, X_Mms_Message_ID, X_Mms_Transaction_ID, \
X_Mms_MMS_Version, X_Mms_Status]
self.setHeaderList(header)
'''
# hcryoo : [20071217_1] : KT ISMC 지원
class M_Send_Req_ISMC_SMS(SmsIsmcMessage_Send):
def __init__(self, message):
SmsIsmcMessage_Send .__init__(self, message)
# hcryoo : [20071217_1] : KT ISMC 지원==
'''
class M_Send_Req_SMS(SmsMessage_Send):
def __init__(self, message):
SmsMessage_Send .__init__(self, message)
header = [X_Mms_Message_Type, X_Message_Type, X_Mms_Transaction_ID, \
X_Mms_MMS_Version, X_Mms_IP, X_Message_Callback, X_Mms_Explicit_No, \
From, To, Subject, X_Mms_Message_Class, X_Mms_Priority, X_Mms_Sender_Visibility, \
X_Mms_Delivery_Report, X_Mms_Read_Reply, X_Mms_Store, Content_Type]
self.setHeaderList(header)
'''
class Submit:
def __init__(self, type, number, contents, notify=0):
self.srr = notify
self.number = number
self.protocol_id = type
self.contents = contents
if type == 'email':
self.pid = PID_EMAIL
elif type == 'fax':
self.pid = PID_FAX
else:
self.pid = PID_NORMAL
self.number += status.callee_terminal_number
ems = emssplit.EmsSplit(contents)
self.segments = []
self.dcs = DCS_7BIT
for udh, p in ems.payloads:
if udh:
self.udhi = 1
else:
self.udhi = 0
header = self.make_header()
self.segments.append(header + p)
def make_header(self):
mti = MTI_SUBMIT
vpf = 0 # 0: not present, 2: relative
rp = rd = 0
header = []
flags = (mti << MTI_SHIFT) | (rd << RD_SHIFT) | \
(self.srr << SRR_SHIFT) | (vpf << VPF_SHIFT) | \
(self.udhi << UDHI_SHIFT) | (rp << RP_SHIFT)
header.append(flags)
status.message_reference = 0xff & (status.message_reference + 1)
mr = status.message_reference
header.append(mr)
addr = encode_address(self.number)
header.append(addr)
pid = self.pid
header.append(pid)
header.append(self.dcs)
# 0 to 143 (vp + 1) * 5 min
# 144 to 167 12hours + (vp - 143) * 30 min
# 168 to 196 (vp - 166) * 1 day
# 197 to 255 (vp - 192) * 1 week
if vpf:
vp = 0x03 # 20 min
header.append(vp)
s = ''
for h in header:
if type(h) == type(0):
h = chr(h)
s += h
return s
class DeliverReport:
def __init__(self, message):
self.udhi = 0
self.dcs = DCS_7BIT
self.segments = []
header = self.make_header()
#추가 메시지를 보내지않는다
#text = gsm7.gsm7bit_encode(message)
#content = chr(len(text)) + gsm7.gsm7_pack(text, 0)
content = ''
self.segments.append(header + content)
def make_header(self):
mti = MTI_DELIVER_REPORT
header = []
flags = (mti << MTI_SHIFT) | (self.udhi << UDHI_SHIFT)
header.append(flags)
header.append(0xd0) # failure cause: sms storage full
#user data가 있으면 3대신 7을 사용
header.append(3) # parameter indicator: has pid, dcs, user data
header.append(PID_NORMAL)
header.append(self.dcs)
s = ''
for h in header:
if type(h) == type(0):
h = chr(h)
s += h
return s
def get_sms_message_type(data):
flags = ord(data[0])
mti = (flags >> MTI_SHIFT) & MTI_MASK
if mti == MTI_DELIVER:
return 'deliver'
elif mti == MTI_SUBMIT_REPORT:
return 'report'
elif mti == MTI_STATUS_REPORT:
return 'status'
class Deliver(Parser):
def __init__(self, message):
Parser.__init__(self, message)
self.compress = False
self.contents = []
self.ems_contents = []
self.content_type = 'Text'
self.message_ref = 0
self.message_total_number = 1
self.message_seq = 1
self.bad_udl = False
self.udhl = 0
self.bMMSNoti = SMSMESSASGE
self.parse_header()
self.parse_user_data()
self.arrange_ems()
def IsMMSnotification(self):
userdata = self.raw_data[self.parse_pos:]
if (SMSMESSASGE == self.bMMSNoti or 1 != self.message_seq):
return
mmsheader_index = 0
#TransactionID: 0
mmsheader_index += 1
if 0x06 == ord(userdata[mmsheader_index]):
#print 'token for push pdu'
pass
else:
#print 'IsMMSnotification smsmessage'
self.bMMSNoti = SMSMESSASGE
return
mmsheader_index += 1
lengthofheader = ord(userdata[mmsheader_index])
mmsheader_index += 1
if (-1 == userdata.find('application/vnd.wap.mms-message')):
if 190 == ord(userdata[mmsheader_index]):
#print '190 application/vnd.wap.mms-message'
pass
else:
#print '== SPREE userdata.find -1 & !190'
self.bMMSNoti = SMSMESSASGE
return
mmsdata_index = lengthofheader + mmsheader_index#3
#print 'mmsdata_index', userdata[mmsdata_index:]
while (mmsdata_index < len(userdata)):
#print 'self.raw_data[mmsdata_index]', ord(userdata[mmsdata_index]), mmsdata_index
if (chr(int('8c', 16)) == userdata[mmsdata_index]):
if (chr(int('82', 16)) == userdata[mmsdata_index+1]):
#print 'MMS_Notification'
return
elif (chr(int('86', 16)) == userdata[mmsdata_index+1]):
#print 'MMS_Delivery'
self.bMMSNoti = MMSDELIVERY_IND
return
mmsdata_index += 1
return
def parse_header(self):
#print 'parse_header', ord(self.raw_data[0]), ord(self.raw_data[1]),\
ord(self.raw_data[2]), ord(self.raw_data[3]), ord(self.raw_data[4]), self.parse_pos
flags = self.get_byte()
#print 'pid pars_pos', self.parse_pos
self.mti = (flags >> MTI_SHIFT) & MTI_MASK
self.mms = (flags >> MMS_SHIFT) & MMS_MASK
self.sri = (flags >> SRI_SHIFT) & SRI_MASK
self.udhi = (flags >> UDHI_SHIFT) & UDHI_MASK
self.rp = (flags >> RP_SHIFT) & RP_MASK
#if self.udhi:
# print 'has user data header'
self.parse_addr()
#print 'parse_addr pars_pos', self.parse_pos
self.pid = self.get_byte()
#print 'pid', self.pid, self.raw_data[self.parse_pos-1], self.parse_pos
#print 'pid pars_pos', self.parse_pos
self.parse_dcs()
self.parse_scts()
def parse_dcs(self):
dcs = self.get_byte()
#print 'DCS: %02X' % dcs
if (dcs & 0xF0) == 0xF0:
if (dcs & 0x04) == 0:
self.encoding = ENCODING_7
#print 'dcs: 7bit alphabet'
else:
self.encoding = ENCODING_8
#print 'dcs: 8bit'
elif (dcs & 0xC0) == 0:
if (dcs & 0x0C) == 0:
self.encoding = ENCODING_7
#print 'dcs: 7bit alphabet'
elif (dcs & 0x0C) == 4:
self.encoding = ENCODING_8
#print 'dcs: 8bit data'
elif (dcs & 0x0C) == 8:
#print 'ucs2 encoding'
self.encoding = ENCODING_UCS2
if (dcs & 0x20):
#print 'FIXME: Data is compressed!!!'
self.compress = True
def parse_scts(self):
self.scts = decode_scts(self.get_data(7))
def parse_addr(self):
addr_len = self.get_byte()
addr_type = self.get_byte()
data = self.get_data((addr_len + 1)/2)
#print 'parse_addr', addr_len, addr_type, data
self.addr = decode_addr(addr_len, addr_type, data)
def parse_user_data_header(self):
udhl = self.get_byte()
#print 'user data header length', udhl
self.udhl = udhl
header_end = self.parse_pos + udhl
#print 'header_end', self.parse_pos , header_end
while self.parse_pos < header_end:
self.parse_ied()
def check_MMS_delivery(self):
#print 'check_MMS_delivery'
tmp_parse_pos = self.parse_pos
tmp_udhl = ord(self.raw_data[tmp_parse_pos])
tmp_parse_pos += 1
if len(self.raw_data[tmp_parse_pos:]) < tmp_parse_pos + tmp_udhl:
return
while tmp_parse_pos < tmp_parse_pos + tmp_udhl:
iei = ord(self.raw_data[tmp_parse_pos])
tmp_parse_pos += 1
ieidl = ord(self.raw_data[tmp_parse_pos])
tmp_parse_pos += 1
ied = self.raw_data[tmp_parse_pos:tmp_parse_pos+ieidl]
tmp_parse_pos += ieidl
if iei == 0x05:
#print 'application port address 16 bit'
#assert ieidl == 4
dest_port, orig_port = ord(ied[0]) * 256 + ord(ied[1]), ord(ied[2]) * 256 + ord(ied[3])
#print 'dest port', dest_port, 'orig_port', orig_port
#self.handle_app_port16(dest_port)
if (2948 == dest_port and 9200 == orig_port):
self.bMMSNoti = MMSNOTIFICATION_IND
#print 'destport,origport', MMSNOTIFICATION_IND
if MMSNOTIFICATION_IND == self.bMMSNoti:
#print 'MMS_DELIVERY.no_udhi --', tmp_parse_pos, self.parse_pos
self.parse_pos = tmp_parse_pos
def parse_user_data(self):
import smartmsg
self.udl = self.get_byte()
#print 'user data len', self.udl
if config.sms_debug:
import utils
utils.print_hex(self.raw_data[self.parse_pos:])
remaining_len = len(self.raw_data) - self.parse_pos
# self.udhi = True # 강제로 User Data Header가 있는 것처럼
if self.udhi:
self.parse_user_data_header()
#if not self.udhi:
# self.check_MMS_delivery()
user_data = self.raw_data[self.parse_pos:]
self.IsMMSnotification()
if MMSDELIVERY_IND == self.bMMSNoti:
from mms_net_pdu import Parse_MMSDeliveryReport
to = ''
status = ''
to, status = Parse_MMSDeliveryReport(user_data)
if None == to and None == status:
return
idx = to.find('/TYPE=')
if -1 != idx:
to = to[:idx]
deliverymsg = MMSDELIVERY_MSG % (to, status)
from setting import setting
if setting.mms_enable:
self.bMMSNoti = SMSMESSASGE
self.contents.append(('Text', deliverymsg))
return
#if not user_data:
# print 'user data is empty'
if self.encoding == ENCODING_7:
if not ((remaining_len - 1) * 8 < self.udl * 7 <= (remaining_len * 8)):
#print 'bad udl', self.udl,remaining_len
self.bad_udl = True
return
if self.udhl:
fill = 7 - (self.udhl + 1) * 8 % 7
if fill == 7: fill = 0
else:
fill = 0
if self.udhl:
text_len = (self.udl * 7 - (self.udhl + 1) * 8 - fill)/7
else:
text_len = self.udl
message = gsm7.gsm7_unpack(user_data, fill, text_len)
self.contents.append(('Text', message))
elif self.encoding == ENCODING_8:
if self.udl != remaining_len:
self.bad_udl = True
return
if self.message_total_number != 1:
self.contents.append(smartmsg.RawData(self.content_type, user_data))
return
if self.content_type == 'Multipart':
multi_part = smartmsg.Multipart(user_data)
self.contents += multi_part.contents
else:
if self.bMMSNoti:
#print 'mms.noti.1sms', self.bMMSNoti
self.contents.append(smartmsg.RawData(self.content_type, user_data))
return
if self.content_type == 'Text':
user_data = unicode(user_data, 'iso8859-1').encode('utf8')
self.contents.append(smartmsg.parse_content(self.content_type, user_data))
elif self.encoding == ENCODING_UCS2:
if self.udl != remaining_len:
self.bad_udl = True
return
#print 'FIXME: ucs 2 encoding used'
user_data = unicode(user_data, 'UTF16')
self.contents.append((self.content_type, user_data.encode('utf8')))
def arrange_ems(self):
if config.sms_debug:
print 'arrange_ems', self.ems_contents, self.contents
if not self.ems_contents:
return
if not self.contents:
self.contents = self.ems_contents
return
if len(self.contents) > 1 or self.contents[0][0] != 'Text':
#print 'FIXME:arrage_ems: self.contents', self.contents
#print 'FIXME:arrage_ems: ems_contents', self.ems_contents
return
pos = 0
txt = self.contents[0][1]
contents = []
for ie in self.ems_contents:
#print 'arrage_ems: ie', ie.type
#print 'arrage_ems: pos =', pos, 'ie pos', ie.pos
if ie.pos > pos:
contents.append(('Text', txt[pos:ie.pos]))
pos = ie.pos
contents.append((ie.type, ie))
if len(txt) > pos:
contents.append(('Text', txt[pos:]))
self.contents = contents
def parse_ied(self):
iei = self.get_byte()
ieidl = self.get_byte()
ied = self.get_data(ieidl)
#print 'parse_ied: iei = %02X, ieidl = %d' % (iei, ieidl)
if iei == 0x00:
self.message_ref = ord(ied[0])
self.message_total_number = ord(ied[1])
self.message_seq = ord(ied[2])
#print 'concaternated short message: 8 bit', self.message_ref, self.message_total_number, self.message_seq
#if self.message_seq == 0:
# print 'WARNING: invalid sms ref: 0', 'Will be discarded'
#if self.message_seq == 0:
# self.message_seq = 2
elif iei == 0x04:
#print 'application port address 8 bit'
#assert ieidl == 2
dest_port, orig_port = ord(ied[0]), ord(ied[1])
#print 'dest port', dest_port, 'orig_port', orig_port
elif iei == 0x05:
#print 'application port address 16 bit'
#assert ieidl == 4
dest_port, orig_port = ord(ied[0]) * 256 + ord(ied[1]), ord(ied[2]) * 256 + ord(ied[3])
#print 'dest port', dest_port, 'orig_port', orig_port
self.handle_app_port16(dest_port)
if (2948 == dest_port and 9200 == orig_port):
self.bMMSNoti = MMSNOTIFICATION_IND
#print 'destport,origport', MMSNOTIFICATION_IND
elif iei == 0x08:
#print 'concaternated short message: 16 bit'
self.message_ref = ord(ied[0]) * 256 + ord(ied[1])
self.message_total_number = ord(ied[2])
self.message_seq = ord(ied[3])
elif iei == 0x0a:
self.parse_ems_text_format(ied);
#print 'FIXME: EMS text formating'
elif iei == 0x0b:
#assert len(ied) == 2
self.ems_contents.append(ems.PredefinedSound(ied))
#print 'EMS: predefined sound'
elif iei == 0x0c:
self.ems_contents.append(ems.UserDefinedSound(ied))
#print 'EMS: user defined sound' # iMelody max 128
elif iei == 0x0d:
self.ems_contents.append(ems.PredefinedAnimation(ied))
#print 'EMS: predefined animation'
elif iei == 0x0e:
self.ems_contents.append(ems.LargeAnimation(ied))
#print 'EMS: large animation' # 16 * 16 * 4 max 128
elif iei == 0x0f:
self.ems_contents.append(ems.SmallAnimation(ied))
#print 'EMS: small animation' # 8 * 8 * 4 max 32
elif iei == 0x10:
self.ems_contents.append(ems.LargePicture(ied))
#print 'EMS: large picture' # 32 * 32 = 128
elif iei == 0x11:
self.ems_contents.append(ems.SmallPicture(ied))
#print 'EMS: small picture' # 16 * 16 = 32
elif iei == 0x12:
self.ems_contents.append(ems.VariablePicture(ied))
#print 'EMS: variable picture'
elif iei == 0x14:
pass
#print 'FIXME:::: !!!!!!EMS: extended object'
elif iei == 0x15:
pass
#print 'reused extended object'
else:
pass
#print 'FIXME: ************unhandled IED', iei
def parse_ems_text_format(self, ied):
ie_parser = Parser(ied)
#assert len(ied) == 4
pos = ie_parser.get_byte()
formatting_len = ie_parser.get_byte()
formatting_mode = ie_parser.get_byte()
color = ie_parser.get_byte()
def handle_app_port16(self, port):
if port == 0x1582:
self.content_type = 'Operator Logo'
#print 'Operator Logo'
elif port == 0x1581:
self.content_type = 'Ring'
#print 'Ring data'
elif port == 0x1583:
self.content_type = 'CLI Icon'
#print 'CLI Icon'
elif port == 0x158A:
self.content_type = 'Multipart'
#print 'Multipart'
elif port == 0x23F5:
self.content_type = 'vCalendar'
#print 'vCalendar'
elif port == 0x23F4:
self.content_type = 'vCard'
#print 'vCalendar'
else:
pass
#print 'Unhandled App Pport %04X' % port
class StatusReport(Deliver):
def __init__(self, message):
Parser.__init__(self, message)
self.compress = False
self.contents = []
self.ems_contents = []
self.content_type = 'Text'
self.message_ref = 0
self.message_total_number = 1
self.message_seq = 1
self.bad_udl = False
self.udhl = 0
self.has_udl = False
self.bMMSNoti = SMSMESSASGE
self.parse_header()
if self.has_udl:
self.parse_user_data()
else:
if config.sms_debug:
print 'status report: no user data'
def parse_header(self):
flags = self.get_byte()
self.mti = (flags >> MTI_SHIFT) & MTI_MASK
self.mms = (flags >> MMS_SHIFT) & MMS_MASK
self.udhi = (flags >> UDHI_SHIFT) & UDHI_MASK
#if self.udhi:
# print 'has user data header'
self.ref = self.get_byte()
self.parse_addr()
#print self.addr
self.parse_scts()
if config.sms_debug:
print 'status report: scts', self.scts
self.parse_dt()
if config.sms_debug:
print 'status report: dt', self.dt
self.parse_status()
if config.sms_debug:
print 'status report: total size', len(self.raw_data), 'current pos =', self.parse_pos
if len(self.raw_data) <= self.parse_pos:
return
self.pi = self.get_byte()
if self.pi & 1:
self.pid = self.get_byte()
if self.pi & 2:
self.parse_dcs()
else:
self.encoding = ENCODING_7
if self.pi & 4:
self.has_udl = True
def parse_dt(self):
self.dt = decode_scts(self.get_data(7))
def parse_status(self):
self.status = self.get_byte()
if config.sms_debug:
print 'sms status: status =', self.status
# 0: received
# 1: can't confirm
# 2: replaced
# 32: congestion
# 32 + 1: sme busy
# 32 + 2: no response from SME
# 32 + 3: service rejected
# 32 + 4: qos not available
# 32 + 5: error in SME
#
class SmsMessage:
def __init__(self, *va):
self.type = ''
self.number = ''
self.contents = []
self.protocol_id = ''
if va:
self._set(*va)
self.filename = None
self.time = None
self.read = False
self.sent = False
self.bMMSNoti = SMSMESSASGE
def _set(self, number = '', protocol_id = '', contents = []):
self.type = 'submit'
self.number = number
self.protocol_id = protocol_id
self.contents = contents
def set_from_submit(self, submit):
self._set(submit.number, submit.protocol_id, submit.contents)
def get_submit(self, **kw):
return Submit(self.protocol_id, self.number, self.contents, **kw)
def send(self, **kw):
#print 'sms send', self.contents
submit = self.get_submit(**kw)
try:
runtime.modem.sms_send(submit.segments)
except utils.InterruptException:
runtime.manager.queue_interrupt()
raise
import time, ntptime
y, m1, d, h, m2, s = time.localtime(ntptime.ntime())[:6]
self.time = (y-2000, m1, d, h, m2, s, 0)
def set_from_deliver(self, deliver):
self.type = 'deliver'
self.number = deliver.addr
self.time = deliver.scts
self.contents = deliver.contents
if (deliver.bMMSNoti):
self.bMMSNoti = MMSNOTIFICATION_IND
def set_from_status_report(self, sr):
self.type = 'status report'
self.number = sr.addr
self.time = sr.scts
self.contents = sr.contents
def summary(self, count):
s = ''
for t, c in self.contents:
if t == 'Text':
s += c
return (unicode(s, 'utf-8')[:count]).encode('utf-8')
def get_pictures(self):
ret = []
for type, c in self.contents:
if type in ('Bitmap',):
ret.append(c)
return ret
def get_predefined_melodies(self):
ret = []
for type, c in self.contents:
if type == 'Melody':
if c.predefined:
ret.append(c)
return ret
def get_melodies(self):
ret = []
for type, c in self.contents:
if type in ('Melody',):
ret.append(c)
return ret
def load(self, filename):
self.filename = filename
fp = open(filename)
self.type = fp.readline().strip()
self.number = fp.readline().strip()
self.protocol_id = fp.readline().strip()
time_str = fp.readline().strip()
if time_str:
self.time = [int(x) for x in time_str.split()]
else:
self.time = None
if self.type == 'submit':
self.sent = False
if fp.readline().strip() == '1':
self.sent = True
else:
self.read = False
if fp.readline().strip() == '1':
self.read = True
self.contents = []
while True:
data_type = fp.readline().strip()
#print data_type
if not data_type:
break
c1, c2 = fp.read(2)
data_len = ord(c1) * 256 + ord(c2)
#print 'data len', data_len
data = fp.read(data_len)
### content loader
self.contents.append(ems.load_data(data_type, data))
def MMSload(self, filename, text):
self.filename = filename
self.contents = []
if self.filename:
fp = open(filename)
text = fp.read()
# text = unicode(text, 'utf-8')
text = text.strip()
self.contents.append(('Text', text))
def save(self, filename = None):
if not filename:
#assert self.filename
filename = self.filename
fp = open(filename, 'w')
fp.write(self.type + '\n')
fp.write(self.number + '\n')
fp.write(self.protocol_id + '\n')
if self.time:
fp.write('%d %d %d %d %d %d %d' % tuple(self.time) + '\n')
else:
#fp.write('\n')
import time, ntptime
y, m1, d, h, m2, s = time.localtime(ntptime.ntime())[:6]
self.time = (y-2000, m1, d, h, m2, s, 0)
fp.write('%d %d %d %d %d %d %d' % tuple(self.time) + '\n')
if self.type == 'submit':
fp.write('%d' % self.sent + '\n')
else:
fp.write('%d' % self.read + '\n')
for type, content in self.contents:
fp.write(type + '\n')
if type != 'Text':
content = content.get_raw_data()
content_len = len(content)
c1, c2 = divmod(content_len, 256)
fp.write(chr(c1) + chr(c2))
fp.write(content)
class MmsHeaderHandler:
def __init__(self):
self.toName = ''
self.toDomain = ''
# MMS Header
self.mmsMessageType = ''
self.messageType = ''
self.messageCallback = ''
self.mmsExplicitNo = ''
self.transactionID = ''
self.mmsVersion = MMS_VERSION_VALUE
self.mmsIP = ''
self.mmsDate = ''
self.mmsFrom = ''
self.mmsTo = ''
self.mmsSubject = ''
self.mmsMessageClass = PERSONAL_CLASS
self.deliveryTime = ''
self.mmsPriority = Priority_Normal
self.mmsSenderVisibility = Visibility_Show
self.mmsDeliveryReport = True
self.mmsReadReply = False
self.store = False
self.mmsContentType = ''
self.mmsMessageID = ''
self.mmsTransactionID = ''
self.mmsResponseStatus = ''
self.mmsResponseStatusText = ''
self.mmsStatus = ''
self.header = []
def printVar(self, number):
print '>>>> MmsHeaderHandler ====> ', number
print 'self.mmsMessageType = ', self.mmsMessageType
print 'self.messageType = ', self.messageType
print 'self.messageCallback = ', self.messageCallback
print 'self.mmsExplicitNo = ', self.mmsExplicitNo
print 'self.transactionID = ', self.transactionID
print 'self.mmsVersion = ', self.mmsVersion
print 'self.mmsIP = ', self.mmsIP
print 'self.mmsDate = ', self.mmsDate
print 'self.mmsFrom = ', self.mmsFrom
print 'self.mmsTo = ', self.mmsTo
print 'self.mmsSubject = ', self.mmsSubject
print 'self.mmsMessageClass = ', self.mmsMessageClass
print 'self.deliveryTime = ', self.deliveryTime
print 'self.mmsPriority = ', self.mmsPriority
print 'self.mmsSenderVisibility = ', self.mmsSenderVisibility
print 'self.mmsDeliveryReport = ', self.mmsDeliveryReport
print 'self.mmsReadReply = ', self.mmsReadReply
print 'self.store = ', self.store
print 'self.mmsContentType = ', self.mmsContentType
print 'self.mmsMessageID = ', self.mmsMessageID
print 'self.mmsTransactionID = ', self.mmsTransactionID
print 'self.mmsResponseStatus = ', self.mmsResponseStatus
print 'self.mmsResponseStatusText = ', self.mmsResponseStatusText
print 'self.mmsStatus = ', self.mmsStatus
print 'end -------------------------'
def getToName(self):
return self.toName
def setToName(self, toName):
self.toName = toName
def getToDomain(self):
return self.toDomain
def setToDomain(self, toDomain):
self.toDomain = toDomain
# MMS Header
def getMmsMessageType(self):
return self.mmsMessageType
def setMmsMessageType(self, mmsMessageType):
self.mmsMessageType = mmsMessageType
def getMessageType(self):
return self.messageType
def setMessageType(self, messageType):
self.messageType = messageType
def getMessageCallback(self):
return self.messageCallback
def setMessageCallback(self, messageCallback):
self.messageCallback = messageCallback
def getMmsExplicitNo(self):
return self.mmsExplicitNo
def setMmsExplicitNo(self, mmsExplicitNo):
self.mmsExplicitNo = mmsExplicitNo
def getTransactionID(self):
return self.transactionID
def setTransactionID(self, transactionID):
self.transactionID = transactionID
def getMmsVersion(self):
return self.mmsVersion
def setMmsVersion(self, mmsVersion):
self.mmsVersion = mmsVersion
def getMmsIP(self):
return self.mmsIP
def setMmsIP(self, mmsIP):
self.mmsIP = mmsIP
def getMmsDate(self):
return self.mmsDate
def setMmsDate(self, mmsDate):
self.mmsDate = mmsDate
def getMmsFrom(self):
return self.mmsFrom
def setMmsFrom(self, mmsFrom):
self.mmsFrom = mmsFrom
def getMmsTo(self):
return self.mmsTo
def makeMmsTo(self):
return 'sip:' + self.toName[:3] +'_' + self.toName[3:6] + '_' + self.toName[6:10]+ '@' + self.toDomain
def setMmsTo(self, mmsTo):
self.mmsTo = mmsTo
def getMmsSubject(self):
return self.mmsSubject
def setMmsSubject(self, mmsSubject):
self.mmsSubject = mmsSubject
def getMmsMessageClass(self):
return self.mmsMessageClass
def setMmsMessageClass(self, mmsMessageClass):
self.mmsMessageClass = mmsMessageClass
def getDeliveryTime(self):
return self.deliveryTime
def makeTimeStamp(self):
import time
now = time.localtime()
now = now[:6]
now = '%04d%02d%02d%02d%02d%02d' % now
return now
def setDeliveryTime(self, deliveryTime):
self.deliveryTime = deliveryTime
def getMmsPriority(self):
return self.mmsPriority
def setMmsPriority(self, mmsPriority):
self.mmsPriority = mmsPriority
def getMmsSenderVisibility(self):
return self.mmsSenderVisibility
def setMmsSenderVisibility(self, mmsSenderVisibility):
self.mmsSenderVisibility = mmsSenderVisibility
def getMmsDeliveryReport(self):
return self.mmsDeliveryReport
def setMmsDeliveryReport(self, mmsDeliveryReport):
self.mmsDeliveryReport = mmsDeliveryReport
def getMmsReadReply(self):
return self.mmsReadReply
def setMmsReadReply(self, mmsReadReply):
self.mmsReadReply = mmsReadReply
def getStore(self):
return self.store
def setStore(self, store):
self.store = store
def getMmsContentType(self):
return self.mmsContentType
def setMmsContentType(self, mmsContentType):
self.mmsContentType = mmsContentType
# conf
def getMmsMessageID(self):
return self.mmsMessageID
def setMmsMessageID(self, mmsMessageID):
self.mmsMessageID = mmsMessageID
def getMmsTransactionID(self):
return self.mmsTransactionID
def setMmsTransactionID(self, mmsTransactionID):
self.mmsTransactionID = mmsTransactionID
def getMmsResponseStatus(self):
return self.mmsResponseStatus
def setMmsResponseStatus(self, mmsResponseStatus):
self.mmsResponseStatus = mmsResponseStatus
def getMmsStatus(self):
return self.mmsResponseStatus
def setMmsStatus(self, mmsStatus):
self.mmsStatus = mmsStatus
def getMmsResponseStatusText(self):
return self.mmsResponseStatusText
def setMmsResponseStatusText(self, mmsResponseStatusText):
self.mmsResponseStatusText = mmsResponseStatusText
def makeHeader(self, headerList):
for headerName in headerList:
if headerName == X_Mms_Message_Type:
self.header.append(X_Mms_Message_Type + ': ' + self.mmsMessageType + CRLF)
elif headerName == X_Message_Type:
self.header.append(X_Message_Type + ': ' + self.messageType + CRLF)
elif headerName == X_Mms_Message_ID:
self.header.append(X_Mms_Message_ID + ': ' + self.mmsMessageID + CRLF)
elif headerName == X_Message_Callback:
if self.messageCallback:
self.header.append(X_Message_Callback + ': ' + self.messageCallback + CRLF)
elif headerName == X_Mms_Explicit_No:
if self.mmsExplicitNo:
self.header.append(X_Mms_Explicit_No + ': ' + self.mmsExplicitNo + CRLF)
elif headerName == X_Mms_Transaction_ID:
self.transactionID = self.toName + self.toDomain + Get_CurrentDate()
self.header.append(X_Mms_Transaction_ID + ': ' + self.transactionID + CRLF)
elif headerName == X_Mms_MMS_Version:
self.header.append(X_Mms_MMS_Version + ': ' + self.mmsVersion + CRLF)
elif headerName == X_Mms_IP:
import phonesetting
self.mmsIP = phonesetting.cur_profile.ipaddress
self.header.append(X_Mms_IP + ': ' + self.mmsIP + CRLF)
elif headerName == From:
from vdcisetting import vdci_setting
self.mmsFrom = 'sip:' + vdci_setting.tel_num + '@' + vdci_setting.domain
self.header.append(From + ': ' + self.mmsFrom + CRLF)
elif headerName == To:
self.header.append(To + ': ' + self.mmsTo + CRLF)
elif headerName == Subject:
self.header.append(Subject + ': ' + self.mmsSubject + CRLF)
elif headerName == X_Mms_Message_Class:
self.header.append(X_Mms_Message_Class + ': ' + self.mmsMessageClass + CRLF)
elif headerName == X_Mms_Delivery_Time:
if self.deliveryTime:
self.header.append(X_Mms_Delivery_Time + ': ' + self.deliveryTime + CRLF) #YYYYMMDDhhmmss
elif headerName == X_Mms_Priority:
self.header.append(X_Mms_Priority + ': ' + self.mmsPriority + CRLF)
elif headerName == X_Mms_Sender_Visibility:
self.header.append(X_Mms_Sender_Visibility + ': ' + self.mmsSenderVisibility + CRLF)
elif headerName == X_Mms_Delivery_Report:
if self.mmsDeliveryReport:
self.header.append(X_Mms_Delivery_Report + ': ' + YES + CRLF)
else:
self.header.append(X_Mms_Delivery_Report + ': ' + NO + CRLF)
elif headerName == X_Mms_Read_Reply:
if self.mmsReadReply:
self.header.append(X_Mms_Read_Reply + ': ' + YES + CRLF)
else:
self.header.append(X_Mms_Read_Reply + ': ' + NO + CRLF)
elif headerName == X_Mms_Store:
if self.store:
self.header.append(X_Mms_Store + ': ' + YES + CRLF)
else:
self.header.append(X_Mms_Store + ': ' + NO + CRLF)
elif headerName == Content_Type:
self.header.append(Content_Type + ': ' + self.mmsContentType + CRLF) #Content-Type
elif headerName == X_Mms_Staus:
self.header.append(X_Mms_Staus + ': ' + self.mmsStatus + CRLF)
if config.mms_debug:
print '== [HEADER] : MM1_Submit_Request_SMS ==============='
print self.header
print '==========================================='
return ''.join(self.header)
# hcryoo : [20071217_1] : KT ISMC 지원
class IsmcContentHandler:
def __init__(self):
self.contents = []
self.supported = True
# MMS Body
def getContents(self):
return self.contents
def setContents(self, contents):
self.contents = contents
def appendContent(self, content):
self.contents.append(content)
def setSupported(self, supported):
self.supported = supported
def getSupported(self):
return self.supported
def cutTwoByteInBody(self):
index = 0
for i, content in enumerate(self.contents):
if type == 'Text':
index = i
cuttedString = self.contents[index][1][:-2]
del(self.contents[index])
self.contents.insert(index, ('Text', cuttedString))
def makeMessage(self):
message = []
for type, content in self.contents:
if type == 'Text':
content = unicode(content, 'utf-8').encode('euc-kr')
message.append(content)
continue
return ''.join(message)
# hcryoo : [20071217_1] : KT ISMC 지원==
'''
class MmsBodyHandler:
def __init__(self):
self.contents = []
self.supported = True
# MMS Body
def getContents(self):
return self.contents
def setContents(self, contents):
self.contents = contents
def appendContent(self, content):
self.contents.append(content)
def setSupported(self, supported):
self.supported = supported
def getSupported(self):
return self.supported
def cutTwoByteInBody(self):
index = 0
for i, content in enumerate(self.contents):
if type == 'Text':
index = i
cuttedString = self.contents[index][1][:-2]
del(self.contents[index])
self.contents.insert(index, ('Text', cuttedString))
def makeBody(self):
body = []
for type, content in self.contents:
if type == 'Text':
content = unicode(content, 'utf-8').encode('euc-kr')
body.append(content)
continue
return ''.join(body)
'''
# hcryoo : [20071217_1] : KT ISMC 지원
class IsmcMessageHandler:
def __init__(self, contentH=None):
if not contentH:
self.ismcContentHandler = IsmcContentHandler()
else:
self.ismcContentHandler = contentH
self.messageString = ''
self.filePath = ''
self.ismcSubject = ''
self.deliveryTime = ''
def getIsmcSubject(self):
return self.ismcSubject
def setIsmcSubject(self, ismcSubject):
self.ismcSubject = ismcSubject
def getDeliveryTime(self):
return self.deliveryTime
def setDeliveryTime(self, deliveryTime):
self.deliveryTime = deliveryTime
def makeTimeStamp(self):
import time
now = time.localtime()
now = now[:6]
now = '%04d%02d%02d%02d%02d%02d' % now
return now
def getMessageString(self):
return self.messageString
def setMessageString(self, messageString):
self.messageString = messageString
def getIsmcContentHandler(self):
return self.ismcContentHandler
def setIsmcContentHandler(self, ismcContentHandler):
self.ismcContentHandler = ismcContentHandler
def makeIsmcBody(self, makeSubject=False):
if self.ismcContentHandler.getSupported():
self.messageString = self.ismcContentHandler.makeMessage()
else:
self.messageString = ''
if makeSubject and self.messageString:
self.ismcSubject = unicode(self.messageString, 'euc-kr')[:12].encode('utf-8')
pass
msgsize = len(self.messageString)+1 / 1024
if not utils.check_free_storage('mms_save', msgsize):
from basemodel import StorageFullError
raise StorageFullError
return
self.filePath = mmsconfig.mms_temp_message + Get_CurrentDate()
fileHandle = open(self.filePath, 'wb+')
if self.ismcContentHandler.getSupported():
#fileHandle.write(CRLF)
fileHandle.write(self.messageString)
fileHandle.close()
return self.filePath
def parse(self, filename):
if filename:
fileHandle = open(filename)
else:
print 'ERROR MESSAGE PARSE'
return
for line in fileHandle:
if self.ismcContentHandler.getSupported():
self.ismcContentHandler.appendContent(('Text', line))
fileHandle.close()
# hcryoo : [20071217_1] : KT ISMC 지원==
'''
class MmsMessageHandler:
def __init__(self, headerH=None, bodyH=None):
if not headerH:
self.mmsHeaderHandler = MmsHeaderHandler()
else:
self.mmsHeaderHandler = headerH
if not bodyH:
self.mmsBodyHandler = MmsBodyHandler()
else:
self.mmsBodyHandler = bodyH
self.headerString = ''
self.bodyString = ''
self.filePath = ''
def getMmsHeaderHandler(self):
return self.mmsHeaderHandler
def setMmsHeaderHandler(self, mmsHeaderHandler):
self.mmsHeaderHandler = mmsHeaderHandler
def getMmsBodyHandler(self):
return self.mmsBodyHandler
def setMmsBodyHandler(self, mmsBodyHandler):
self.mmsBodyHandler = mmsBodyHandler
def getHeaderString(self):
return self.headerString
def setHeaderString(self, headerString):
self.headerString = headerString
def makeMmsMessage(self, headerList):
self.headerString = self.mmsHeaderHandler.makeHeader(headerList)
if self.mmsBodyHandler.getSupported():
self.bodyString = self.mmsBodyHandler.makeBody()
else:
self.bodyString = ''
msgsize = (len(self.headerString)+len(self.bodyString)+1) / 1024
if not utils.check_free_storage('mms_save', msgsize):
from basemodel import StorageFullError
raise StorageFullError
return
self.filePath = mmsconfig.mms_temp_message + Get_CurrentDate()
fileHandle = open(self.filePath, 'wb+')
fileHandle.write(self.headerString)
if self.mmsBodyHandler.getSupported():
fileHandle.write(CRLF)
fileHandle.write(self.bodyString)
fileHandle.close()
return self.filePath
def removeCRLF(self, headerValue):
if headerValue:
headerValue = headerValue.replace('\n', '')
headerValue = headerValue.replace('\r', '')
else:
headerValue = ''
return headerValue
def parse(self, filename):
if filename:
fileHandle = open(filename)
else:
print 'ERROR MESSAGE PARSE'
return
isHeader = True
for line in fileHandle:
if isHeader:
headerName = line[:line.find(':')]
headerValue = self.removeCRLF(line[line.find(':')+2:])
if headerName == mms_net_define.X_Mms_Message_Type:
self.mmsHeaderHandler.setMmsMessageType(headerValue)
elif headerName == mms_net_define.X_Mms_Message_ID:
self.mmsHeaderHandler.setMmsMessageID(headerValue)
elif headerName == mms_net_define.Date:
self.mmsHeaderHandler.setMmsDate(headerValue)
elif headerName == mms_net_define.To:
self.mmsHeaderHandler.setMmsTo(headerValue)
elif headerName == mms_net_define.X_Message_Type:
self.mmsHeaderHandler.setMessageType(headerValue)
elif headerName == mms_net_define.X_Message_Callback:
self.mmsHeaderHandler.setMessageCallback(headerValue)
elif headerName == mms_net_define.X_Mms_Explicit_No:
self.mmsHeaderHandler.setMmsExplicitNo(headerValue)
elif headerName == mms_net_define.From:
self.mmsHeaderHandler.setMmsFrom(headerValue)
elif headerName == mms_net_define.Subject:
self.mmsHeaderHandler.setMmsSubject(headerValue)
elif headerName == mms_net_define.X_Mms_Message_Class:
self.mmsHeaderHandler.setMmsMessageClass(headerValue)
elif headerName == mms_net_define.X_Mms_Priority:
self.mmsHeaderHandler.setMmsPriority(headerValue)
elif headerName == mms_net_define.X_Mms_Sender_Visibility:
self.mmsHeaderHandler.setMmsSenderVisibility(headerValue)
elif headerName == mms_net_define.X_Mms_Delivery_Report:
self.mmsHeaderHandler.setMmsDeliveryReport(headerValue)
elif headerName == mms_net_define.Content_Type:
self.mmsHeaderHandler.setMmsContentType(headerValue)
elif headerName == mms_net_define.Message_ID:
self.mmsHeaderHandler.setMmsMessageID(headerValue)
elif headerName == mms_net_define.X_Mms_Transaction_ID:
self.mmsHeaderHandler.setMmsTransactionID(headerValue)
elif headerName == mms_net_define.X_Mms_Response_Status:
self.mmsHeaderHandler.setMmsResponseStatus(headerValue)
elif headerName == mms_net_define.X_Mms_Response_Status_Text:
self.mmsHeaderHandler.setMmsResponseStatusText(headerValue)
elif headerName == mms_net_define.X_Mms_Status:
self.mmsHeaderHandler.setMmsStatus(headerValue)
else:
if line == CRLF:
isHeader = False
else:
if self.mmsBodyHandler.getSupported():
self.mmsBodyHandler.contents.append(('Text', line))
fileHandle.close()
'''
class SmsMessage_KT:
def __init__(self):
self.smsInfoHandler = SmsInfoHandler()
self.smsSipHandler = SmsSipHandler()
self.ismcMessageHanler = IsmcMessageHandler()
def getSmsInfoHandler(self):
return self.smsInfoHandler
def setSmsInfoHandler(self, smsInfoHandler):
self.smsInfoHandler = smsInfoHandler
def getSmsSipHandler(self):
return self.smsSipHandler
def setSmsSipHandler(self, smsSipHandler):
self.smsSipHandler = smsSipHandler
def getIsmcMessageHandler(self):
return self.ismcMessageHandler
def setIsmcMessageHandler(self, ismcMessageHandler):
self.ismcMessageHandler = ismcMessageHandler
def save(self, filename = None):
if not filename:
print 'ERROR in SAVE'
return
import os
os.rename(self.smsSipHandler.getSipAbsMessagePath(), filename)
self.smsSipHandler.setSipAbsMessagePath(filename)
def load(self, filename):
self.filename = filename
fp = open(filename)
self.type = fp.readline().strip()
self.number = fp.readline().strip()
self.protocol_id = fp.readline().strip()
time_str = fp.readline().strip()
if time_str:
self.time = [int(x) for x in time_str.split()]
else:
self.time = None
if self.type == 'submit':
self.sent = False
if fp.readline().strip() == '1':
self.sent = True
else:
self.read = False
if fp.readline().strip() == '1':
self.read = True
self.contents = []
while True:
data_type = fp.readline().strip()
#print data_type
if not data_type:
break
c1, c2 = fp.read(2)
data_len = ord(c1) * 256 + ord(c2)
#print 'data len', data_len
data = fp.read(data_len)
### content loader
self.contents.append(ems.load_data(data_type, data))
def submit_test():
status.message_reference = 8
submit = Submit('email', '4210', 'abcdefg')
m = str(submit)
#print 'message len', len(m)
#for x in m:
# print "[%02X]" % ord(x)
def save_test():
message = SmsMessage()
message.load('00000001')
#print message.contents
def deliver_test():
mms_deli = "\x91\x7F\x44\x09\x81\x09\x70\x61\x08\xF0\x00\x04\x50\x21\x70\x22\
\x21\x00\x40\x6D\x06\x05\x04\x0B\x84\x23\xF0\x04\x06\x37\x61\x70\
\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x76\x6E\x64\x2E\x77\x61\
\x70\x2E\x6D\x6D\x73\x2D\x6D\x65\x73\x73\x61\x67\x65\x00\x45\x6E\
\x63\x6F\x64\x69\x6E\x67\x2D\x76\x65\x72\x73\x69\x6F\x6E\x00\x31\
\x2E\x31\x00\xAF\x84\x8C\x86\x8D\x91\x8B\x32\x30\x30\x35\x31\x32\
\x30\x37\x32\x32\x31\x30\x32\x34\x34\x35\x39\x36\x35\x00\x97\x39\
\x31\x33\x32\x36\x30\x37\x37\x36\x00\x85\x04\x43\x97\x50\x20\x95\
\x85\xBD"
segment1 = "\x91\x9E\x40\x0A\x81\x21\x43\x65\x87\x09\x00\x00\x30\x11\x72\x01\x03\x32\x40\xA0\x05\x00\x03\x99\x02\x01\xA0\xF2\x74\xFB\x0D\x22\xA7\x41\xE4\x7A\x19\xD4\x2E\xCF\xE7\xE1\xF3\x39\x0D\x1A\xBF\xDD\xE3\x30\xBD\xEC\x0E\xD3\xD3\x20\xB8\x3C\xDD\x7E\x83\xC8\x69\x10\xB9\x5E\x06\xB5\xCB\xF3\x79\xF8\x7C\x4E\x83\xC6\x6F\xF7\x38\x4C\x2F\xBB\xC3\xF4\x34\x08\x2E\x4F\xB7\xDF\x20\x72\x1A\x44\xAE\x97\x41\xED\xF2\x7C\x1E\x3E\x9F\xD3\xA0\xF1\xDB\x3D\x0E\xD3\xCB\xEE\x30\x3D\x0D\x82\xCB\xD3\xED\x37\x88\x9C\x06\x91\xEB\x65\x50\xBB\x3C\x9F\x87\xCF\xE7\x34\x68\xFC\x76\x8F\xC3\xF4\xB2\x3B\x4C\x4F\x83\xCC\x69\x77\x19\xD4\x2E\xCF\xE7\xE1\xF3\x39\xFD\x06\xC5\x5C\xBD"
segment2 = "\x91\x66\x44\x0A\x81\x21\x43\x65\x87\x09\x00\x00\x30\x11\x72\x01\x03\x32\x40\x60\x05\x00\x03\x99\x02\x02\xA6\xE5\xF1\xDB\x4D\x7E\x83\xC8\x69\x10\xB9\x5E\x06\xB5\xCB\xF3\x79\xF8\x7C\x4E\x83\xC6\x6F\xF7\x38\x4C\x2F\xBB\xC3\xF4\x34\x68\x5E\x1E\xBF\xDD\xE4\x37\x88\x9C\x06\x91\xEB\x65\x50\xBB\x3C\x9F\x87\xCF\xE7\x34\x68\xFC\x76\x8F\xC3\xF4\xB2\x3B\x4C\x4F\x83\xCC\x69\x77\x19\xD4\x2E\xCF\xE7\xE1\xF3\x39\xFD\x06\xC9\x5C\x20"
deliver1 = Deliver(segment1[2:-1])
deliver2 = Deliver(segment2[2:-1])
#print 'deliver1', deliver1.contents
#print 'deliver2', deliver2.contents
import sms
sms.sms_queue.add((deliver1,))
messages = sms.sms_queue.get_message()
#import smsmanager
#for m in messages:
# smsmanager.smsmgr.insert_msg(m)
sms.sms_queue.add((deliver2,))
messages = sms.sms_queue.get_message()
#for m in messages:
# print 'message contents', m.contents
def status_report_test():
message = "\x22\x01\x0B\x91\x80\x00\x11\x50\x76\xF8\x50\x10\x40\x00\x31" + \
"\x03\x00\x50\x10\x40\x00\x31\x03\x00\x00\x04\x35\xF9\x77\x5D\x0E" + \
"\x6A\x97\xE7\xF3\xF0\xB9\x0C\xBA\x87\xE7\xA0\xF1\x5B\x2E\x2F\x8F" + \
"\xE9\xEC\x3C\x88\x5C\x66\xA7\xED\x65\x79\x99\x0C\x0A\xD3\x41\x74" + \
"\x74\x19\x24\x2F\x8F\xD3\xF0\x74\xD9\x4D\x07"
sr = StatusReport(message)
#print sr.contents
if __name__ == '__main__':
#save_test()
#deliver_test()
status_report_test()