summaryrefslogblamecommitdiffstats
path: root/For Weekly Test/12-09-2011/SIPHandler.py
blob: 8802a09ce5c2e6de40c3e507ec89745c0c8253d6 (plain) (tree)
1
2
3
4
5
6
7
8
9








                            

                                                











                                                  
                

                                              





























































                                                                       
                                                             

                           




                                      
                                                 
                                        
 
                                       
                                                      
                                    
 
                                            
                                                            
                                                      
 

                                                    















                                        
                        

                       

        

                                               
 

                                            
 

                                                




                  



                      












                                                                                     
        


                           
                                                                                      

                                                                        
 








                                                                         
                                                                    















                                                                            
                                                                    


                                                                
                                                                

































                                                                                                 
import sys
import string
import pjsua as pj
import ServerClass
import LogFileClass

from time import sleep

def log_cb(level, str, len):
	print '\n'
	print "--------starting Handler--------"

# Receive events from incoming Call
class Account(pj.AccountCallback):

	def on_incoming_call(self, call):
		global current_call

		current_call = call
        	call_cb = Calling(current_call)
        	current_call.set_callback(call_cb)

		logger.logEvent(current_call)
		
		call.answer(200)
		logger.logEvent("Answer call")

		if current_call <> None:
			logger.logEvent("Hangup call")
			call.hangup()
		
		logger.logEvent('CALL OK')

class Calling(pj.CallCallback):

    	def __init__(self, call=None):
        	pj.CallCallback.__init__(self, call)

	def on_state(self):
		global current_call

		if self.call.info().state <> pj.CallState.DISCONNECTED:
			if self.call.info().state_text == "CONNECTING":
				logger.logEvent("Call Connecting")
				logger.logEvent('200')
				server.sendData('CALL OK')

		if self.call.info().last_reason == "Busy Here":
			logger.logEvent('Number busy or Offline')
			server.sendData('CALL NOT OK')
			logger.logEvent('CALL NOT OK')
        
        	if self.call.info().state == pj.CallState.DISCONNECTED:
			logger.logEvent('Call Disconnected')
			current_call = None


def make_call(uri):

    try:

	cb=Calling()
        return acc.make_call(uri, cb)

    except pj.Error, e:
        print "408 " + str(e)
	logger.logEvent('408')
        return None

def greeting():
	global server
	global status
	global port

	port = sys.argv[2]
	server = None
	status = None

	server = ServerClass.ServerHandler(port)
	logger.logEvent('try to Connect to Controller')
	conn = server.openSocket() 

	if server.connected == 1:
		if server.receiveData(30) == 'HELLO HANDLER':
			server.sendData('HELLO CONTROLLER')
			status = 'OK'
	else:
		status = 'NOT OK'
		logger.logEvent('Cant connect to Controller')
		sys.exit(1)

def initLogFile(sipServer):
	
	global logger
	
	if sipServer == '132.230.4.8':
		nameOfLogFile = 'SIP handler.log'
		print '--SIP Asterisk--'

	elif sipServer == 'sipgate.de':
		nameOfLogFile = 'Landline handler.log'
		print '--Landline--'

	elif sipServer == '132.230.252.228':
		nameOfLogFile = 'University SIP handler.log'
		print '--university tephone network--'

	logger = LogFileClass.Logging(nameOfLogFile)

def initState():
	global message
	global state
	global num

	logger.logEvent('init state')
	message = server.receiveData(30)

	if message == 'RECEIVER':
		state	= 'RECEIVER'

	elif message[0:6] == 'CALLER':
		state	= 'CALLER'
		num	= message[7:]

def initHandler():
	global sipServer
	global username
	global password
	

	accConf = sys.argv[1]
	username = accConf[0:accConf.find(':')]

	line = accConf[accConf.find(':')+1:]
	password = line[0:line.find(':')]

	newLine = line[line.find(':')+1:]
	sipServer = newLine[0:newLine.find(':')]


lib 	= pj.Lib()
stop	= False

initHandler()

initLogFile(sipServer)

logger.logEvent('')

while stop <> True:
	
	acc_cfg = None

	lib.init(log_cfg = pj.LogConfig(level=1, callback=log_cb))
	transport = lib.create_transport(pj.TransportType.UDP, pj.TransportConfig(0))

	lib.start()
	lib.set_null_snd_dev()
	
	greeting()
	

	try:
		initState()
		acc_cfg = pj.AccountConfig(str(sipServer),str(username),str(password))
		logger.logEvent('Register Account to SIP server')	
		acc = lib.create_account(acc_cfg, cb=Account())

		if acc.info().reg_status < 700:

			if state =='RECEIVER':
				logger.logEvent(acc.info().reg_status)
				server.sendData('RECEIVER READY')
				logger.logEvent('Receiver Handler Ready')

    				while 1:
			
					data = server.receiveData(1)

					if data == 'RECEIVE START':
						logger.logEvent(data)

					if data == 'TERMINATE CONNECTION':
						logger.logEvent('Terminate')
						stop = True
						break

   			elif state =='CALLER':
				logger.logEvent(acc.info().reg_status)
				server.sendData('CALLER READY')
				logger.logEvent('Caller Handler Ready')

				while 1:
				
					data = server.receiveData(1)

					if data == 'CALL START':
						if num <> '':
							sleep(3)
							logger.logEvent(data)
							logger.logEvent('Make a call to: ' + num)
							number = "sip:"+num+"@"+sipServer
							make_call(number)
						else:
							logger.logEvent('No number to call')
							logger.logEvent('CALL NOT OK')

					if data == 'TERMINATE CONNECTION':
						stop = True
						logger.logEvent('Terminate')
						break

			else:
				logger.logEvent('Unknow Message')
				server.sendData('Unknow Message')
				server.closeConnection()
				sys.exit(0.5)
					
		else:
			logger.logEvent("488 Not Acceptable Here")
			lib.destroy()

	except ValueError:    
		print "401 Unauthorized " + str(e)
		logger.logEvent("401 Unauthorized ")

logger.logEvent("Goodbye")
acc.delete()
lib.destroy()
server.closeConnection()
lib = None
acc = None