Vizible’s Blog

Python – SflPhone Dbus

Posted in Python by wearetherock on August 26, 2009

import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject
from gobject import GObject
from SimpleXMLRPCServer import SimpleXMLRPCServer
import thread

class SlfPhoneConnector :

	def __init__(self) :
		self.activeCalls = {}

		account = {
			"username" : "1111", 
			"Account.type" : "SIP", 
			"hostname" : "192.168.1.109", 
			"Account.alias" : "1111", 
			"password":"1111", 
			"Account.enable" : "TRUE"
		}
		session = dbus.SessionBus()

		conf_obj = session.get_object("org.sflphone.SFLphone", "/org/sflphone/SFLphone/ConfigurationManager")  
		self.conf_mgr = dbus.Interface(conf_obj ,"org.sflphone.SFLphone.ConfigurationManager")

		call_obj = session.get_object("org.sflphone.SFLphone", "/org/sflphone/SFLphone/CallManager")  
		self.call_mgr = dbus.Interface(call_obj ,"org.sflphone.SFLphone.CallManager")

		'''
		i= session.get_object("org.sflphone.SFLphone", "/org/sflphone/SFLphone/ConfigurationManager")  
		instance = dbus.Interface(object,"org.sfphone.SFLphone.Instance")
		'''

		self.call_mgr.connect_to_signal('incomingCall', self.on_incoming_call)
		self.call_mgr.connect_to_signal('callStateChanged', self.on_call_state_changed)

		self.account_id = self.conf_mgr.addAccount(account)

		self.conf_mgr.sendRegister(self.account_id, 1)			 
		
		#self.call_mgr.placeCall(self.account_id, self.account_id, "2222" )	 

	def on_incoming_call(self, account, callid, to):
		print "Incoming call: " + account + ", " + callid + ", " + to
		self.activeCalls[callid] = {'Account': account, 'To': to, 'State': '' }   

		self.call_mgr.accept(str(callid))

	# On call state changed event, set the values for new calls, 
	# or delete the call from the list of active calls
	def on_call_state_changed(self, callid, state):
		print "Call state changed: " + callid + ", " + state
		if state == "HUNGUP":
			try:
				del self.activeCalls[callid]
			except KeyError:
				print "Call " + callid + " didn't exist. Cannot delete."

		elif state in [ "RINGING", "CURRENT", "INCOMING", "HOLD" ]:
			try:
				self.activeCalls[callid]['State'] = state 
			except KeyError, e:
				print "This call didn't exist!: " + callid + ". Adding it to the list."
				callDetails = self.getCallDetails(callid)
				self.activeCalls[callid] = {'Account': callDetails['ACCOUNTID'], 'To': callDetails['PEER_NUMBER'], 'State': state }
		elif state in [ "BUSY", "FAILURE" ]:
			try:
				del self.activeCalls[callid]
			except KeyError, e:
				print "This call didn't exist!: " + callid   


	def getCallDetails(self, callid):
		"""Return informations on this call if exists"""
		return self.call_mgr.getCallDetails(callid)

	def place_call(self, callid):
		self.call_mgr.placeCall(self.account_id, self.account_id, callid)

	def hangup(self) :
		call0 = self.activeCalls.keys()[0]
		self.call_mgr.hangUp(call0)


def start_server(obj):
	server = SimpleXMLRPCServer( ("localhost", 9988), allow_none= True)
	server.register_instance(obj)

	print "server start @localhost 9988 forever ..."
	server.serve_forever()

if __name__ == "__main__" :

	DBusGMainLoop(set_as_default=True)
	s  = SlfPhoneConnector()

	thread.start_new_thread(start_server(s,))

	loop = gobject.MainLoop()
	loop.run()

Advertisements

2 Responses

Subscribe to comments with RSS.

  1. wearetherock said, on August 26, 2009 at 12:53 pm

    ไว้ก๊อปปี้

  2. wearetherock said, on August 27, 2009 at 2:27 pm

    ชิบหาย โปรแกรมนี้มันทำงานไม่ถูก Main Loop ไม่ส่ง Event อะไรออกมาเลย


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: