class NetServer:
	def __init__(self,stPartsMgr):
		#部件
		self.m_stPartsMgr = stPartsMgr
		#NetFdData
		self.m_hFdData    = {}
		#网络回调
		stPartsMgr.m_stMsgQ.RegMsg(MsgQueue.MsgData(MsgQueue.MsgQType.eMsgNetSock,self.NetDispatchMsg))

	#listen 成功
	def ListenCb(self,stSockMsg):
		return	

	#connect 成功
	def ConnectCb(self,stSockMsg):
		logger.debug("connect cb fd=%d"%(stSockMsg.m_iFd))
		stFd = self.GetFdData(stSockMsg.m_iFd)
		if stFd == None:
			print("connect cb not found data fd=%d"%(stSockMsg.m_iFd))
			logger.error("connect cb not found data fd=%d"%(stSockMsg.m_iFd))
			return
		if stFd.m_fCSuccessCb != None: 
			stFd.m_fCSuccessCb(stFd) 
		else:
			stFd.m_stUd = NetPack.PackQueue() 
		logger.debug("connect success fd=%d"%(stSockMsg.m_iFd))	

	#accept 成功
	def AcceptCb(self,stSockMsg):
		stLFd = self.GetFdData(stSockMsg.m_sData[1])
		stAFd = self.CreateFdData(stLFd.m_fDataCb,stLFd.m_fCSuccessCb,stLFd.m_fCloseCb,stSockMsg.m_iFd)
		stAFd.m_fCSuccessCb != None and stAFd.m_fCSuccessCb(stAFd,stSockMsg.m_sData[0])	

	#close fd
	def CloseCb(self,stSockMsg):
		stFd = self.GetFdData(stSockMsg.m_iFd)
		if stFd == None:
			logger.error("close not found fd=%d data=%s"%(stSockMsg.m_iFd,stSockMsg))
			return False
		stFd.m_fCloseCb != None and stFd.m_fCloseCb(stFd)
		logger.debug("close fd=%d data=%s"%(stSockMsg.m_iFd,stSockMsg))
		del self.m_hFdData[stSockMsg.m_iFd]
		return True

	#接收到数据
	def NetDataCb(self,stSockMsg):
		stFd = self.GetFdData(stSockMsg.m_iFd)
		if stFd == None:
			logger.error("fd recv data not found fd=%d data=%s"%(stSockMsg.m_iFd,stSockMsg))
			return
		stFd.m_fDataCb(stSockMsg,stFd.m_stUd)

	#创建 fd data
	def CreateFdData(self,fDataCb,fCSuccessCb,fCloseCb,iFd=None):
		iFd = iFd != None and iFd or self.m_stPartsMgr.m_stSockServer.MakeFd() 
		if self.m_hFdData.has_key(iFd):
			stData = self.m_hFdData[iFd]
			logger.error("double net server fd=%d data=%s"%(iFd,stData))
			return stData
		stData = NetFdData(iFd,fDataCb,fCSuccessCb,fCloseCb)
		self.m_hFdData[iFd] = stData
		logger.debug("net server create fd=%d data=%s"%(iFd,stData))
		return stData

	#获得 fd data
	def GetFdData(self,iFd):
		if not self.m_hFdData.has_key(iFd):
			return None
		return self.m_hFdData[iFd]

	#获得线程 Id
	def GetThreadId(self):
		return self.m_stPartsMgr.m_stThread.GetThreadId()

	#网络消息转发
	def NetDispatchMsg(self,stSockMsg):
		if stSockMsg.m_eType == SocketServer.CmdErrno.eCmdError:
			self.CloseCb(stSockMsg)
		elif stSockMsg.m_eType == SocketServer.CmdErrno.eCmdListen: 
			self.ListenCb(stSockMsg)
		elif stSockMsg.m_eType == SocketServer.CmdErrno.eCmdConnect:
			self.ConnectCb(stSockMsg)
		elif stSockMsg.m_eType == SocketServer.CmdErrno.eCmdAccept:
			self.AcceptCb(stSockMsg)
		elif stSockMsg.m_eType == SocketServer.CmdErrno.eCmdClose:
			self.CloseCb(stSockMsg)
		elif stSockMsg.m_eType == SocketServer.CmdErrno.eCmdData:
			self.NetDataCb(stSockMsg)
		elif stSockMsg.m_eType == SocketServer.CmdErrno.eCmdUdp:
			self.NetDataCb(stSockMsg)
		else:
			logger.error("net dispatch error type=%d fd=%d data=%s",stSockMsg.m_eType,stSockMsg.m_iFd,stSockMsg.m_sData)

	#监听一个端口
	def DoListen(self,sIp,iPort,fDCb,fCCb,fCloseCb):
		stSock = self.DoBind(sIp,iPort,socket.IPPROTO_TCP)
		if stSock == None:
			return -1 
		try:
			stSock.listen(32)
		except socket.error,arg:
			stSock.close()
			eno,err_msg = arg
			logger.error("listen error ip=%s port=%d eno=%d err_msg=%s"%(sIp,iPort,eno,err_msg))
			return -1 
		stFd  = self.CreateFdData(fDCb,fCCb,fCloseCb)	
		iFd   = stFd.m_iFd
		stCmd = SocketServer.ListenCmd(SocketServer.CmdType.eCmdListenType,iFd,self.GetThreadId(),stSock)
		self.m_stPartsMgr.m_stSockServer.PushCmd(stCmd)
		return iFd