# -*- coding: utf-8 -*-
from socket import *
import config, utils
from mms_net_define import *
import time, ntptime
#mms socket 클래스.
class MMS_Socket:
def __init__(self, commobj=None):
self.m_commobj = commobj
self.m_totsendsize = None
self.pre_sendprog = None
self.sendprog = 0
self.m_MMS_socket = None
self.soket_tag = None
self.m_recv_tag = None
self.m_recvdata = []
self.m_bcontentlen = False
self.m_icontent_size = 0
self.m_irecvdata = 0
pass
def __del__(self):
self.Disconnect()
def Init_SendTotSize(self):
self.m_totsendsize = None
self.pre_sendprog = None
self.sendprog = 0
def Connect(self, url='', port=80, testup=True):
if DEBUG_MMS_NET:
print 'MMS_Socket.Connect', url, port, testup
self.m_MMS_socket = socket(AF_INET, SOCK_STREAM)
mmsc_ip = ''
mmsc_port = port
connecturl = ''
from mms_net_pdu import Get_Host
connecturl = Get_Host(url)
idx = connecturl.find(':')
if -1 == idx:
mmsc_ip = connecturl
else:
mmsc_port = int(connecturl[idx+1:])
mmsc_ip = connecturl[0:idx]
if DEBUG_MMS_NET:
print 'mmsc_ip, mmsc_port', mmsc_ip, mmsc_port
if TEST_CTR_NET:
mmsc_ip = '218.155.234.167'#'192.168.141.206'#
if testup:
mmsc_port = 10093
else:
mmsc_port = 10090
if DEBUG_MMS_NET:
print '=>CONNECT: ', mmsc_ip, mmsc_port
self.m_MMS_socket.connect((mmsc_ip, mmsc_port))
if DEBUG_MMS_NET:
print 'CONNECT OK'
def Timeout(self):
pass
#mms 서버와의 접속을 해제한다.
def Disconnect(self):
if (None != self.m_MMS_socket):
self.m_MMS_socket.close()
self.m_MMS_socket = None
#버퍼에 저장된 data를 전송한다.
#databuffer: [in] 전송할 데이터 버퍼.
def Send_Data(self, databuffer, totmsgsize=0):
datalength = len(databuffer)
i_sent_len = 0
sendlen = 0
while (i_sent_len < datalength):
time.sleep(0.0001)
if (datalength-i_sent_len)/1024:
sendlen = 1024
else:
sendlen = (datalength-i_sent_len)%1024
sendlen = self.m_MMS_socket.send(databuffer[i_sent_len:i_sent_len+sendlen])
i_sent_len += sendlen
if self.m_commobj and totmsgsize and databuffer:
if None == self.m_totsendsize:
self.m_totsendsize = 0
self.m_commobj.Send_Packet(chr(NMGR_EXTEND|NMGREXT_PROGRESS)+str(self.sendprog))
time.sleep(0.12)
self.m_totsendsize += sendlen
self.sendprog = (self.m_totsendsize*100)/totmsgsize
if DEBUG_MMS_NET:
print 'mms.send.progress', self.sendprog, totmsgsize, sendlen, self.m_totsendsize, self.pre_sendprog
if self.pre_sendprog != self.sendprog:
self.pre_sendprog = self.sendprog
self.m_commobj.Send_Packet(chr(NMGR_EXTEND|NMGREXT_PROGRESS)+str(self.sendprog))
time.sleep(0.12)
if DEBUG_MMS_NET:
print 'MMS_Socket::Send_Data', i_sent_len, datalength, self.m_totsendsize
#서버로부터 데이터를 수신한다.
def Recv_Data(self, progress=False):
if DEBUG_MMS_NET:
print '== Recv_Data'
recv_str = []
recv_data = []
bContent_len = False
contentlength_index = 0
content_end_index = 0
icontent_size = 0
irecvdata = 0
pre_prog = None
prog = 0
temp_http_header = ''
socket_recv_size = 1024
if self.m_commobj and progress:
socket_recv_size = 200
while 1:
try:
recv_str = self.m_MMS_socket.recv(socket_recv_size)
except:
print '## RECV execept ##'
pass
recv_data.append(recv_str)
if not recv_str:
if DEBUG_MMS_NET:
print '== SPREE recv_ret break'
break
time.sleep(0.0001)
if False == bContent_len:
temp_http_header += recv_str
content_end_index = temp_http_header.find('\r\n\r\n')
if 0 < content_end_index:
contentlength_index = temp_http_header.find('Content-Length:')
contentlength_index += len('Content-Length: ')
content_end_index = temp_http_header[contentlength_index:].find('\r\n')
contentsizestr = \
temp_http_header[contentlength_index:(contentlength_index+content_end_index)]
contentsizestr = contentsizestr.strip()
if DEBUG_MMS_NET:
print '== Recv contentsize', contentsizestr
icontent_size = int(contentsizestr)
if 5120 < icontent_size:
socket_recv_size = 1024
bContent_len = True
contentlength_index = temp_http_header.find('\r\n\r\n')
contentlength_index += 4
irecvdata = \
len(temp_http_header) - contentlength_index
temp_http_header = None
else:
irecvdata += len(recv_str)
if self.m_commobj and progress and icontent_size:
if None == pre_prog:
self.m_commobj.Send_Packet(chr(NMGR_EXTEND|NMGREXT_PROGRESS)+str(prog))
time.sleep(0.12)
prog = (irecvdata*100)/icontent_size
if pre_prog != prog:
self.m_commobj.Send_Packet(chr(NMGR_EXTEND|NMGREXT_PROGRESS)+str(prog))
time.sleep(0.12)
pre_prog = prog
if DEBUG_MMS_NET:
print '== SPREE recv_data == ', bContent_len, irecvdata, icontent_size
if bContent_len and icontent_size <= irecvdata:
if DEBUG_MMS_NET:
print '== SPREE recv_data break', irecvdata, icontent_size
break
if DEBUG_MMS_NET:
print 'mms_net_socket.MMS_Socket.Recv_Data'
return recv_data
def Recv_DataInit(self, endcb):
self.m_recv_tag = None
self.m_recvdata = []
self.m_bcontentlen = False
self.m_icontent_size = 0
self.m_irecvdata = 0
self.m_endcb = endcb
self.m_recv_tag = utils.Input(self.m_MMS_socket.fileno(), \
self.Recv_DataHandle)
def Recv_DataHandle(self, fd, type):
if type & evas.INPUT_HUP:
if DEBUG_MMS_NET: print 'Recv_DataHandle.connection_closed'
return False
recv_str = []
try:
recv_str = self.m_MMS_socket.recv(1024)
except:
print '## Recv_DataHandle execept ##'
pass
self.m_recvdata.append(recv_str)
if not recv_str:
if DEBUG_MMS_NET:
print 'Recv_DataHandle not recv_str'
return False
if False == self.m_bcontentlen:
contentlength_index = 0
content_end_index = 0
contentlength_index = recv_str.find('Content-Length:')
if 0 < contentlength_index:
contentlength_index += len('Content-Length: ')
content_end_index = recv_str[contentlength_index:].find('\r\n')
contentsizestr = \
recv_str[contentlength_index:(contentlength_index+content_end_index)]
self.m_icontent_size = int(contentsizestr)
self.m_bcontentlen = True
contentlength_index = recv_str.find('\r\n\r\n')
contentlength_index += 4
self.m_irecvdata = \
len(recv_str) - contentlength_index
else:
self.m_irecvdata += len(recv_str)
if self.m_icontent_size <= self.m_irecvdata:
return False
return True