# $Id: call.py 4704 2014-01-16 05:30:46Z ming $
#
# pjsua Python GUI Demo
#
# Copyright (C)2013 Teluu Inc. (http://www.teluu.com)
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
#
import sys
if sys.version_info[0] >= 3: # Python 3
	import tkinter as tk
	from tkinter import ttk
	from tkinter import messagebox as msgbox
else:
	import Tkinter as tk
	import tkMessageBox as msgbox
	import ttk

import random
import pjsua2 as pj
import application
import endpoint as ep

# Call class
class Call(pj.Call):
	"""
	High level Python Call object, derived from pjsua2's Call object.
	"""
	def __init__(self, acc, peer_uri='', chat=None, call_id = pj.PJSUA_INVALID_ID):
		pj.Call.__init__(self, acc, call_id)
                self.acc = acc
		self.peerUri = peer_uri
		self.chat = chat
		self.connected = False
		self.onhold = False

	def onCallState(self, prm):
		ci = self.getInfo()
		self.connected = ci.state == pj.PJSIP_INV_STATE_CONFIRMED			
		if self.chat:
			self.chat.updateCallState(self, ci)
			
	def onCallMediaState(self, prm):
		ci = self.getInfo()
		for mi in ci.media:
			if mi.type == pj.PJMEDIA_TYPE_AUDIO and \
			  (mi.status == pj.PJSUA_CALL_MEDIA_ACTIVE or \
			   mi.status == pj.PJSUA_CALL_MEDIA_REMOTE_HOLD):
				m = self.getMedia(mi.index)
				am = pj.AudioMedia.typecastFromMedia(m)
				# connect ports
				ep.Endpoint.instance.audDevManager().getCaptureDevMedia().startTransmit(am)
				am.startTransmit(ep.Endpoint.instance.audDevManager().getPlaybackDevMedia())

				if mi.status == pj.PJSUA_CALL_MEDIA_REMOTE_HOLD and not self.onhold:
					self.chat.addMessage(None, "'%s' sets call onhold" % (self.peerUri))
					self.onhold = True
				elif mi.status == pj.PJSUA_CALL_MEDIA_ACTIVE and self.onhold:
					self.chat.addMessage(None, "'%s' sets call active" % (self.peerUri))
					self.onhold = False
			
	def onInstantMessage(self, prm):
		# chat instance should have been initalized
		if not self.chat: return
			
		self.chat.addMessage(self.peerUri, prm.msgBody)
		self.chat.showWindow()
			
	def onInstantMessageStatus(self, prm):
		if prm.code/100 == 2: return
		# chat instance should have been initalized
		if not self.chat: return
		
		self.chat.addMessage(None, "Failed sending message to '%s' (%d): %s" % (self.peerUri, prm.code, prm.reason))
		
	def onTypingIndication(self, prm):
		# chat instance should have been initalized
		if not self.chat: return
		
		self.chat.setTypingIndication(self.peerUri, prm.isTyping)
	
	def onDtmfDigit(self, prm):
		#msgbox.showinfo("pygui", 'Got DTMF:' + prm.digit)
		pass
		
	def onCallMediaTransportState(self, prm):
		#msgbox.showinfo("pygui", "Media transport state")
		pass
		
		
if __name__ == '__main__':
	application.main()
