Newer
Older
Import / projects / LGN-IP3870 / t / orig / mms_net_socket.py
# -*- 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