O que errado quando SimpleXMLRPC e DBusGMainLoop trabalhando ao mesmo tempo

votos
1

Em python eu tento criar um serviço que mantêm chamando evento entre SflPhone (serviço dbus) e aplicativo externo, quando eu começar SimpleXMLRPCServer meu serviço não resposta para qualquer evento de chamada, tais como a função on_call_state_changed não foi chamado.

Quando eu comentar thread.start_new_thread(start_server(s,)) tudo é trabalhar bem. Eu não sei como fazer isso duas coisas trabalhar juntos. Será que alguém pode ajudar? Obrigado.

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

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)


        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(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,))

    ... ` another code here `

    #loop = gobject.MainLoop()
    #loop.run()
Publicado 27/08/2009 em 06:20
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Tente adicionar após truque ifmain:

gobject.threads_init()
dbus.glib.init_threads()
Respondeu 27/08/2009 em 07:30
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more