summaryrefslogblamecommitdiffstats
path: root/Under-Testing/Server-Code-New/SIPHandler.py
blob: eb5302c1873c522fb4ef32a1de0d05359db96071 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16















                                   


                                                          







                                                  
                                                

                                
                
                        
                












                                                                       
                                                                  






                                                                                                             


                                                               





                                                                       









                                           

                                                         

                   









                                                   



                                                         


                                                                                          




                                               
                                          
                    
                     


                                        
 
                     
                     






                                                       

                                                       
                                                             
                                                           
                                
             
                                                             

                          





























                                                            








                                                                     



                  
                   
 















                                                                                     


                             





















                                                                                      
                                                                  





















                                                                                                 














                                                                                            
                                     


                                                                  

                                                           
 
                          
                                                    
                     

                          
                     









                                                 
 
import sys
import string
import pjsua as pj
import ServerClass
import LogFileClass
import setproctitle
from time import sleep
import csv

def log_cb(level, str, len):
	
	print ""

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

	def __init__(self, account=None):
		pj.AccountCallback.__init__(self, account)

	def on_incoming_call(self, call):
		global current_call

		#print 'Incoming Call'
		current_call = call
        	call_cb = Calling(current_call)
        	current_call.set_callback(call_cb)

		logger.logEvent('Incoming Call')
		
		call.answer(200)
		
		sleep(2)
		
		logger.logEvent('CALL OK')

#creating object for calling
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")
				try:
					logger.logEvent('Try to hangup the call')
					self.call.hangup()
					logger.logEvent('Hangup OK')
				except ValueError:
					logger.logEvent('hangup failed, waiting destination hangup the call')

				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

#function to make a call
def make_call(uri):

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

    except pj.Error, e:
	logger.logEvent('Error when trying to call, 408')
	server.sendData('CALL NOT OK')
        return None

def writeToFile():
	try:
		string = '--'
		with open('handler.txt', 'w') as F:
    			writer = csv.writer(F)
    			writer.writerow([string])
		F.close()
	except ValueError:
		print "can't write to file"

def openFile():
	global sipServer, username, password, ip, portadd
	global port

	#file format: 'Account:username:password:server:handler:PortName:portCommunication
	File = open('handler.txt')
	reader = csv.reader(File, delimiter=':')
	for row in reader:
     		if str(row[0]) == 'Account':
			username = str(row[1])
			password = str(row[2])
			sipServer = str(row[3])
			port = int(row[6])
	File.close()
	writeToFile()

#send greeting message to the controller
def greeting():

	global server
	server = None

	# create socket communication object
	server = ServerClass.ServerHandler(port)
	logger.logEvent('try to Connect to Controller')
	conn = server.openSocket() 
	
	if server.connected == 1:
		#connection to the controller establish
		logger.logEvent('Connection Establish')
		if server.receiveData(25) == 'HELLO HANDLER':
			server.sendData('HELLO CONTROLLER')
			return 1
	else:
		logger.logEvent('Cant connect to Controller')
		del server
		return 0

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'
		no	= message[7:]

		# need special handle for calling from unisip account
		if sipServer == '132.230.252.228':
			num = no[7:]
		else:
			num = no

lib 	= pj.Lib()
stop	= False

print 'INIT SYSTEM'

openFile()
setproctitle.setproctitle('SIP Handler')
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()
	
	if greeting() != 1:
		lib.destroy()
		break
	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:

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

				#waiting state
    				while 1:
			
					data = server.receiveData(1)
					if data == 'RECEIVE START':
						print data
						logger.logEvent(data)

					#get shutting down message
					if data == 'TERMINATE CONNECTION':
						print data
						logger.logEvent('Terminate')
						stop = True
						break
			#being caller state
   			elif state =='CALLER':
				logger.logEvent(acc.info().reg_status)
				server.sendData('CALLER READY')
				logger.logEvent('Caller Handler Ready')

				while 1:
					data = server.receiveData(1)
	
					#start the call
					if data == 'CALL START':
						#print data
						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')

					#shutting down message
					if data == 'TERMINATE CONNECTION':
						#print data
						stop = True
						logger.logEvent('Terminate')
						break

			else:
				logger.logEvent('Unknow Message')
				server.sendData('Unknow Message')
				break
					
		else:
			logger.logEvent("488 Not Acceptable Here")
			server.sendData('DEVICE NOT READY')
			break

	except ValueError:
		logger.logEvent("401 Unauthorized ")
		break

logger.logEvent("Goodbye")
logger.closeLogging()
# trying to clean everything before shutting down
try:
	acc.delete()
	lib.destroy()
	lib = None
	acc = None
	server.closeConnection()
	del server
except ValueError:
	message = 'trying failure'