Ignore:
Timestamp:
Jul 21, 2008 6:20:57 PM (16 years ago)
Author:
bennylp
Message:

Major modifications in Python module and pjsua.py wrapper:

  • replaced call/acc/buddy dictionaries with user data attachment
  • recommended to install callback when creating the object, to prevent missing some events
  • fixed circular references by using weakref
  • protect access to pjsua with mutex; found out that without this there will be deadlock in Python
  • fixed memory leaks in the _pjsua.c module (objects reference counter not properly maintained)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip-apps/src/python/pjsua.py

    r2158 r2163  
    151151import _pjsua 
    152152import thread 
     153import threading 
     154import weakref 
    153155 
    154156class Error: 
     
    624626 
    625627    def __init__(self, lib, id): 
    626         self._lib = lib 
     628        self._lib = weakref.proxy(lib) 
    627629        self._id = id 
    628         self._obj_name = "Transport " + self.info().description 
    629  
     630        self._obj_name = "{Transport " + self.info().description + "}" 
     631        _Trace((self, 'created')) 
     632 
     633    def __del__(self): 
     634        _Trace((self, 'destroyed')) 
     635         
    630636    def __str__(self): 
    631637        return self._obj_name 
     
    634640        """Get TransportInfo. 
    635641        """ 
     642        lck = self._lib.auto_lock() 
    636643        ti = _pjsua.transport_get_info(self._id) 
    637644        if not ti: 
     
    641648    def enable(self): 
    642649        """Enable this transport.""" 
     650        lck = self._lib.auto_lock() 
    643651        err = _pjsua.transport_set_enable(self._id, True) 
    644652        self._lib._err_check("enable()", self, err) 
     
    646654    def disable(self): 
    647655        """Disable this transport.""" 
     656        lck = self._lib.auto_lock() 
    648657        err = _pjsua.transport_set_enable(self._id, 0) 
    649658        self._lib._err_check("disable()", self, err) 
     
    655664        force   -- force deletion of this transport (not recommended). 
    656665        """ 
     666        lck = self._lib.auto_lock() 
    657667        err = _pjsua.transport_close(self._id, force) 
    658668        self._lib._err_check("close()", self, err) 
     
    976986    account = None 
    977987 
    978     def __init__(self, account): 
    979         self.account = account 
     988    def __init__(self, account=None): 
     989        self._set_account(account) 
     990 
     991    def __del__(self): 
     992        pass 
     993 
     994    def _set_account(self, account): 
     995        if account: 
     996            self.account = weakref.proxy(account) 
     997        else: 
     998            self.account = None 
    980999 
    9811000    def on_reg_state(self): 
     
    9951014        call.hangup() 
    9961015 
    997     def on_incoming_subscribe(self, buddy, from_uri, pres_obj): 
     1016    def on_incoming_subscribe(self, buddy, from_uri, contact_uri, pres_obj): 
    9981017        """Notification when incoming SUBSCRIBE request is received.  
    9991018         
     
    10991118    _obj_name = "" 
    11001119 
    1101     def __init__(self, lib, id): 
     1120    def __init__(self, lib, id, cb=None): 
    11021121        """Construct this class. This is normally called by Lib class and 
    11031122        not by application. 
     
    11061125        lib -- the Lib instance. 
    11071126        id  -- the pjsua account ID. 
    1108         """ 
    1109         self._cb = AccountCallback(self) 
     1127        cb  -- AccountCallback instance to receive events from this Account. 
     1128               If callback is not specified here, it must be set later 
     1129               using set_callback(). 
     1130        """ 
    11101131        self._id = id 
    1111         self._lib = lib 
    1112         self._lib._associate_account(self._id, self) 
    1113         self._obj_name = "Account " + self.info().uri 
     1132        self._lib = weakref.ref(lib) 
     1133        self._obj_name = "{Account " + self.info().uri + "}" 
     1134        self.set_callback(cb) 
     1135        _pjsua.acc_set_user_data(self._id, self) 
     1136        _Trace((self, 'created')) 
    11141137 
    11151138    def __del__(self): 
    1116         self._lib._disassociate_account(self._id, self) 
     1139        if self._id != -1: 
     1140            _pjsua.acc_set_user_data(self._id, 0) 
     1141        _Trace((self, 'destroyed')) 
    11171142 
    11181143    def __str__(self): 
     
    11221147        """Retrieve AccountInfo for this account. 
    11231148        """ 
     1149        lck = self._lib().auto_lock() 
    11241150        ai = _pjsua.acc_get_info(self._id) 
    11251151        if ai==None: 
    1126             self._lib._err_check("info()", self, -1, "Invalid account") 
     1152            self._lib()._err_check("info()", self, -1, "Invalid account") 
    11271153        return AccountInfo(ai) 
    11281154 
     
    11321158 
    11331159        """ 
     1160        lck = self._lib().auto_lock() 
    11341161        return _pjsua.acc_is_valid(self._id) 
    11351162 
     
    11451172        else: 
    11461173            self._cb = AccountCallback(self) 
     1174        self._cb._set_account(self) 
    11471175 
    11481176    def set_default(self): 
     
    11511179        matching criteria fails. 
    11521180        """ 
     1181        lck = self._lib().auto_lock() 
    11531182        err = _pjsua.acc_set_default(self._id) 
    1154         self._lib._err_check("set_default()", self, err) 
     1183        self._lib()._err_check("set_default()", self, err) 
    11551184 
    11561185    def is_default(self): 
     
    11581187 
    11591188        """ 
     1189        lck = self._lib().auto_lock() 
    11601190        def_id = _pjsua.acc_get_default() 
    11611191        return self.is_valid() and def_id==self._id 
     
    11651195         
    11661196        """ 
     1197        lck = self._lib().auto_lock() 
     1198        err = _pjsua.acc_set_user_data(self._id, 0) 
     1199        self._lib()._err_check("delete()", self, err) 
    11671200        err = _pjsua.acc_del(self._id) 
    1168         self._lib._err_check("delete()", self, err) 
     1201        self._lib()._err_check("delete()", self, err) 
     1202        self._id = -1 
    11691203 
    11701204    def set_basic_status(self, is_online): 
     
    11751209 
    11761210        """ 
     1211        lck = self._lib().auto_lock() 
    11771212        err = _pjsua.acc_set_online_status(self._id, is_online) 
    1178         self._lib._err_check("set_basic_status()", self, err) 
     1213        self._lib()._err_check("set_basic_status()", self, err) 
    11791214 
    11801215    def set_presence_status(self, is_online,  
     
    11911226 
    11921227        """ 
     1228        lck = self._lib().auto_lock() 
    11931229        err = _pjsua.acc_set_online_status2(self._id, is_online, activity, 
    11941230                                            pres_text, rpid_id) 
    1195         self._lib._err_check("set_presence_status()", self, err) 
     1231        self._lib()._err_check("set_presence_status()", self, err) 
    11961232 
    11971233    def set_registration(self, renew): 
     
    12031239 
    12041240        """ 
     1241        lck = self._lib().auto_lock() 
    12051242        err = _pjsua.acc_set_registration(self._id, renew) 
    1206         self._lib._err_check("set_registration()", self, err) 
    1207  
    1208     def has_registration(self): 
    1209         """Returns True if registration is active for this account. 
    1210  
    1211         """ 
    1212         acc_info = _pjsua.acc_get_info(self._id) 
    1213         if not acc_info: 
    1214             self._lib._err_check("has_registration()", self, -1,  
    1215                                  "invalid account") 
    1216         return acc_info.has_registration 
     1243        self._lib()._err_check("set_registration()", self, err) 
    12171244 
    12181245    def set_transport(self, transport): 
     
    12241251 
    12251252        """ 
     1253        lck = self._lib().auto_lock() 
    12261254        err = _pjsua.acc_set_transport(self._id, transport._id) 
    1227         self._lib._err_check("set_transport()", self, err) 
    1228  
    1229     def make_call(self, dst_uri, hdr_list=None): 
     1255        self._lib()._err_check("set_transport()", self, err) 
     1256 
     1257    def make_call(self, dst_uri, cb=None, hdr_list=None): 
    12301258        """Make outgoing call to the specified URI. 
    12311259 
    12321260        Keyword arguments: 
    12331261        dst_uri  -- Destination SIP URI. 
     1262        cb       -- CallCallback instance to be installed to the newly 
     1263                    created Call object. If this CallCallback is not 
     1264                    specified (i.e. None is given), it must be installed 
     1265                    later using call.set_callback(). 
    12341266        hdr_list -- Optional list of headers to be sent with outgoing 
    12351267                    INVITE 
    12361268 
    1237         """ 
     1269        Return: 
     1270            Call instance. 
     1271        """ 
     1272        lck = self._lib().auto_lock() 
     1273        call = Call(self._lib(), -1, cb) 
    12381274        err, cid = _pjsua.call_make_call(self._id, dst_uri, 0,  
    1239                                            0, Lib._create_msg_data(hdr_list)) 
    1240         self._lib._err_check("make_call()", self, err) 
    1241         return Call(self._lib, cid) 
    1242  
    1243     def add_buddy(self, uri): 
     1275                                         call, Lib._create_msg_data(hdr_list)) 
     1276        self._lib()._err_check("make_call()", self, err) 
     1277        call.attach_to_id(cid) 
     1278        return call 
     1279 
     1280    def add_buddy(self, uri, cb=None): 
    12441281        """Add new buddy. 
    12451282 
    12461283        Keyword argument: 
    1247         uri         -- SIP URI of the buddy 
     1284        uri     -- SIP URI of the buddy 
     1285        cb      -- BuddyCallback instance to be installed to the newly 
     1286                   created Buddy object. If this callback is not specified 
     1287                   (i.e. None is given), it must be installed later using 
     1288                   buddy.set_callback(). 
    12481289 
    12491290        Return: 
    12501291            Buddy object 
    12511292        """ 
     1293        lck = self._lib().auto_lock() 
    12521294        buddy_cfg = _pjsua.buddy_config_default() 
    12531295        buddy_cfg.uri = uri 
    12541296        buddy_cfg.subscribe = False 
    12551297        err, buddy_id = _pjsua.buddy_add(buddy_cfg) 
    1256         self._lib._err_check("add_buddy()", self, err) 
    1257         return Buddy(self._lib, buddy_id, self) 
     1298        self._lib()._err_check("add_buddy()", self, err) 
     1299        buddy = Buddy(self._lib(), buddy_id, self, cb) 
     1300        return buddy 
    12581301 
    12591302    def pres_notify(self, pres_obj, state, reason="", hdr_list=None): 
     
    12681311        hdr_list    -- Optional header list. 
    12691312        """ 
     1313        lck = self._lib().auto_lock() 
    12701314        _pjsua.acc_pres_notify(self._id, pres_obj, state, reason,  
    12711315                               Lib._create_msg_data(hdr_list)) 
     
    12841328    call = None 
    12851329 
    1286     def __init__(self, call): 
    1287         self.call = call 
     1330    def __init__(self, call=None): 
     1331        self._set_call(call) 
     1332 
     1333    def __del__(self): 
     1334        pass 
     1335 
     1336    def _set_call(self, call): 
     1337        if call: 
     1338            self.call = weakref.proxy(call) 
     1339        else: 
     1340            self.call = None 
    12881341 
    12891342    def on_state(self): 
     
    14691522        self.media_dir = ci.media_dir 
    14701523        self.conf_slot = ci.conf_slot 
    1471         self.call_time = ci.connect_duration.sec 
    1472         self.total_time = ci.total_duration.sec 
     1524        self.call_time = ci.connect_duration / 1000 
     1525        self.total_time = ci.total_duration / 1000 
    14731526 
    14741527 
     
    14841537    _obj_name = "" 
    14851538 
    1486     def __init__(self, lib, call_id): 
    1487         self._cb = CallCallback(self)  
    1488         self._id = call_id 
    1489         self._lib = lib 
    1490         self._lib._associate_call(call_id, self) 
    1491         self._obj_name = "Call " + self.info().remote_uri 
     1539    def __init__(self, lib, call_id, cb=None): 
     1540        self._lib = weakref.ref(lib) 
     1541        self.set_callback(cb) 
     1542        self.attach_to_id(call_id) 
     1543        _Trace((self, 'created')) 
    14921544 
    14931545    def __del__(self): 
    1494         self._lib._disassociate_call(self._id, self) 
     1546        if self._id != -1: 
     1547            _pjsua.call_set_user_data(self._id, 0) 
     1548        _Trace((self, 'destroyed')) 
    14951549 
    14961550    def __str__(self): 
    14971551        return self._obj_name 
     1552 
     1553    def attach_to_id(self, call_id): 
     1554        lck = self._lib().auto_lock() 
     1555        if self._id != -1: 
     1556            _pjsua.call_set_user_data(self._id, 0) 
     1557        self._id = call_id 
     1558        if self._id != -1: 
     1559            _pjsua.call_set_user_data(self._id, self) 
     1560            self._obj_name = "{Call " + self.info().remote_uri + "}" 
     1561        else: 
     1562            self._obj_name = "{Call object}" 
    14981563 
    14991564    def set_callback(self, cb): 
     
    15081573        else: 
    15091574            self._cb = CallCallback(self) 
     1575        self._cb._set_call(self) 
    15101576 
    15111577    def info(self): 
     
    15131579        Get the CallInfo. 
    15141580        """ 
     1581        lck = self._lib().auto_lock() 
    15151582        ci = _pjsua.call_get_info(self._id) 
    15161583        if not ci: 
    1517             self._lib._err_check("info", self, -1, "Invalid call") 
    1518         return CallInfo(self._lib, ci) 
     1584            self._lib()._err_check("info", self, -1, "Invalid call") 
     1585        call_info = CallInfo(self._lib(), ci) 
     1586        return call_info 
    15191587 
    15201588    def is_valid(self): 
     
    15221590        Check if this call is still valid. 
    15231591        """ 
     1592        lck = self._lib().auto_lock() 
    15241593        return _pjsua.call_is_active(self._id) 
    15251594 
     
    15281597        Dump the call status. 
    15291598        """ 
     1599        lck = self._lib().auto_lock() 
    15301600        return _pjsua.call_dump(self._id, with_media, max_len, indent) 
    15311601 
     
    15421612 
    15431613        """ 
     1614        lck = self._lib().auto_lock() 
    15441615        err = _pjsua.call_answer(self._id, code, reason,  
    15451616                                   Lib._create_msg_data(hdr_list)) 
    1546         self._lib._err_check("answer()", self, err) 
     1617        self._lib()._err_check("answer()", self, err) 
    15471618 
    15481619    def hangup(self, code=603, reason="", hdr_list=None): 
     
    15581629 
    15591630        """ 
     1631        lck = self._lib().auto_lock() 
    15601632        err = _pjsua.call_hangup(self._id, code, reason,  
    15611633                                   Lib._create_msg_data(hdr_list)) 
    1562         self._lib._err_check("hangup()", self, err) 
     1634        self._lib()._err_check("hangup()", self, err) 
    15631635 
    15641636    def hold(self, hdr_list=None): 
     
    15701642                    message. 
    15711643        """ 
     1644        lck = self._lib().auto_lock() 
    15721645        err = _pjsua.call_set_hold(self._id, Lib._create_msg_data(hdr_list)) 
    1573         self._lib._err_check("hold()", self, err) 
     1646        self._lib()._err_check("hold()", self, err) 
    15741647 
    15751648    def unhold(self, hdr_list=None): 
     
    15821655 
    15831656        """ 
     1657        lck = self._lib().auto_lock() 
    15841658        err = _pjsua.call_reinvite(self._id, True,  
    15851659                                     Lib._create_msg_data(hdr_list)) 
    1586         self._lib._err_check("unhold()", self, err) 
     1660        self._lib()._err_check("unhold()", self, err) 
    15871661 
    15881662    def reinvite(self, hdr_list=None): 
     
    15951669 
    15961670        """ 
     1671        lck = self._lib().auto_lock() 
    15971672        err = _pjsua.call_reinvite(self._id, True,  
    15981673                                     Lib._create_msg_data(hdr_list)) 
    1599         self._lib._err_check("reinvite()", self, err) 
     1674        self._lib()._err_check("reinvite()", self, err) 
    16001675 
    16011676    def update(self, hdr_list=None, options=0): 
     
    16091684 
    16101685        """ 
     1686        lck = self._lib().auto_lock() 
    16111687        err = _pjsua.call_update(self._id, options,  
    16121688                                   Lib._create_msg_data(hdr_list)) 
    1613         self._lib._err_check("update()", self, err) 
     1689        self._lib()._err_check("update()", self, err) 
    16141690 
    16151691    def transfer(self, dest_uri, hdr_list=None): 
     
    16231699 
    16241700        """ 
     1701        lck = self._lib().auto_lock() 
    16251702        err = _pjsua.call_xfer(self._id, dest_uri,  
    16261703                                 Lib._create_msg_data(hdr_list)) 
    1627         self._lib._err_check("transfer()", self, err) 
     1704        self._lib()._err_check("transfer()", self, err) 
    16281705 
    16291706    def transfer_to_call(self, call, hdr_list=None, options=0): 
     
    16381715 
    16391716        """ 
     1717        lck = self._lib().auto_lock() 
    16401718        err = _pjsua.call_xfer_replaces(self._id, call._id, options, 
    16411719                                          Lib._create_msg_data(hdr_list)) 
    1642         self._lib._err_check("transfer_to_call()", self, err) 
     1720        self._lib()._err_check("transfer_to_call()", self, err) 
    16431721 
    16441722    def dial_dtmf(self, digits): 
     
    16501728 
    16511729        """ 
     1730        lck = self._lib().auto_lock() 
    16521731        err = _pjsua.call_dial_dtmf(self._id, digits) 
    1653         self._lib._err_check("dial_dtmf()", self, err) 
     1732        self._lib()._err_check("dial_dtmf()", self, err) 
    16541733 
    16551734    def send_request(self, method, hdr_list=None, content_type=None, 
     
    16701749 
    16711750        """ 
     1751        lck = self._lib().auto_lock() 
    16721752        if hdr_list and body: 
    16731753            msg_data = _pjsua.Msg_Data() 
     
    16821762                 
    16831763        err = _pjsua.call_send_request(self._id, method, msg_data) 
    1684         self._lib._err_check("send_request()", self, err) 
     1764        self._lib()._err_check("send_request()", self, err) 
    16851765 
    16861766 
     
    17371817    buddy = None 
    17381818 
    1739     def __init__(self, buddy): 
    1740         self.buddy = buddy 
     1819    def __init__(self, buddy=None): 
     1820        self._set_buddy(buddy) 
     1821 
     1822    def _set_buddy(self, buddy): 
     1823        if buddy: 
     1824            self.buddy = weakref.proxy(buddy) 
     1825        else: 
     1826            self.buddy = None 
    17411827 
    17421828    def on_state(self): 
     
    17941880    _acc = None 
    17951881 
    1796     def __init__(self, lib, id, account): 
    1797         self._cb = BuddyCallback(self) 
    1798         self._lib = lib 
     1882    def __init__(self, lib, id, account, cb): 
    17991883        self._id = id 
    1800         self._acc = account 
    1801         lib._associate_buddy(self._id, self) 
    1802         self._obj_name = "Buddy " + self.info().uri 
     1884        self._lib = weakref.ref(lib) 
     1885        self._acc = weakref.ref(account) 
     1886        self._obj_name = "{Buddy " + self.info().uri + "}" 
     1887        self.set_callback(cb) 
     1888        _pjsua.buddy_set_user_data(self._id, self) 
     1889        _Trace((self, 'created')) 
    18031890 
    18041891    def __del__(self): 
    1805         self._lib._disassociate_buddy(self) 
     1892        if self._id != -1: 
     1893            _pjsua.buddy_set_user_data(self._id, 0) 
     1894        _Trace((self, 'destroyed')) 
    18061895 
    18071896    def __str__(self): 
     
    18121901        Get buddy info as BuddyInfo. 
    18131902        """ 
     1903        lck = self._lib().auto_lock() 
    18141904        return BuddyInfo(_pjsua.buddy_get_info(self._id)) 
    18151905 
     
    18241914        else: 
    18251915            self._cb = BuddyCallback(self) 
     1916        self._cb._set_buddy(self) 
    18261917 
    18271918    def subscribe(self): 
     
    18291920        Subscribe to buddy's presence status notification. 
    18301921        """ 
     1922        lck = self._lib().auto_lock() 
    18311923        err = _pjsua.buddy_subscribe_pres(self._id, True) 
    1832         self._lib._err_check("subscribe()", self, err) 
     1924        self._lib()._err_check("subscribe()", self, err) 
    18331925 
    18341926    def unsubscribe(self): 
     
    18361928        Unsubscribe from buddy's presence status notification. 
    18371929        """ 
     1930        lck = self._lib().auto_lock() 
    18381931        err = _pjsua.buddy_subscribe_pres(self._id, False) 
    1839         self._lib._err_check("unsubscribe()", self, err) 
     1932        self._lib()._err_check("unsubscribe()", self, err) 
    18401933 
    18411934    def delete(self): 
     
    18431936        Remove this buddy from the buddy list. 
    18441937        """ 
     1938        lck = self._lib().auto_lock() 
     1939        if self._id != -1: 
     1940            _pjsua.buddy_set_user_data(self._id, 0) 
    18451941        err = _pjsua.buddy_del(self._id) 
    1846         self._lib._err_check("delete()", self, err) 
     1942        self._lib()._err_check("delete()", self, err) 
    18471943 
    18481944    def send_pager(self, text, im_id=0, content_type="text/plain", \ 
     
    18601956 
    18611957        """ 
    1862         err = _pjsua.im_send(self._acc._id, self.info().uri, \ 
     1958        lck = self._lib().auto_lock() 
     1959        err = _pjsua.im_send(self._acc()._id, self.info().uri, \ 
    18631960                             content_type, text, \ 
    18641961                             Lib._create_msg_data(hdr_list), \ 
    18651962                             im_id) 
    1866         self._lib._err_check("send_pager()", self, err) 
     1963        self._lib()._err_check("send_pager()", self, err) 
    18671964 
    18681965    def send_typing_ind(self, is_typing=True, hdr_list=None): 
     
    18751972 
    18761973        """ 
    1877         err = _pjsua.im_typing(self._acc._id, self.info().uri, \ 
     1974        lck = self._lib().auto_lock() 
     1975        err = _pjsua.im_typing(self._acc()._id, self.info().uri, \ 
    18781976                               is_typing, Lib._create_msg_data(hdr_list)) 
    1879         self._lib._err_check("send_typing_ind()", self, err) 
     1977        self._lib()._err_check("send_typing_ind()", self, err) 
    18801978 
    18811979 
     
    19822080 
    19832081 
     2082# Library mutex 
     2083class _LibMutex: 
     2084    def __init__(self, lck): 
     2085        self._lck = lck 
     2086        self._lck.acquire() 
     2087        #print 'lck acquire' 
     2088 
     2089    def __del__(self): 
     2090        self._lck.release() 
     2091        #print 'lck release' 
     2092 
     2093 
    19842094# PJSUA Library 
    19852095_lib = None 
     
    19882098     
    19892099    """ 
    1990     call = {} 
    1991     account = {} 
    1992     buddy = {} 
    1993     buddy_by_uri = {} 
    1994     buddy_by_contact = {} 
    19952100    _quit = False 
    19962101    _has_thread = False 
     2102    _lock = None 
    19972103 
    19982104    def __init__(self): 
     
    20012107            raise Error("__init()__", None, -1,  
    20022108                        "Library instance already exist") 
    2003              
     2109 
     2110        self._lock = threading.RLock() 
    20042111        err = _pjsua.create() 
    20052112        self._err_check("_pjsua.create()", None, err) 
     
    20082115    def __del__(self): 
    20092116        _pjsua.destroy() 
     2117        del self._lock 
     2118        print 'Lib destroyed' 
    20102119 
    20112120    def __str__(self): 
     
    20492158 
    20502159        err = _pjsua.init(py_ua_cfg, log_cfg._cvt_to_pjsua(),  
    2051                             media_cfg._cvt_to_pjsua()) 
     2160                          media_cfg._cvt_to_pjsua()) 
    20522161        self._err_check("init()", self, err) 
    20532162 
     
    20592168            loop = 0 
    20602169            while self._quit != 2 and loop < 400: 
    2061                 _pjsua.handle_events(50) 
     2170                self.handle_events(50) 
    20622171                loop = loop + 1 
    20632172        _pjsua.destroy() 
    20642173        _lib = None 
    2065          
     2174 
    20662175    def start(self, with_thread=True): 
    20672176        """Start the library.  
     
    20882197 
    20892198        """ 
     2199        lck = self.auto_lock() 
    20902200        return _pjsua.handle_events(timeout) 
    20912201 
     
    21012211 
    21022212        """ 
     2213        lck = self.auto_lock() 
    21032214        return _pjsua.verify_sip_url(sip_url) 
    21042215 
     
    21142225 
    21152226        """ 
     2227        lck = self.auto_lock() 
    21162228        if not cfg: cfg=TransportConfig(type) 
    21172229        err, tp_id = _pjsua.transport_create(type, cfg._cvt_to_pjsua()) 
     
    21192231        return Transport(self, tp_id) 
    21202232 
    2121     def create_account(self, acc_config, set_default=True): 
     2233    def create_account(self, acc_config, set_default=True, cb=None): 
    21222234        """ 
    21232235        Create a new local pjsua account using the specified configuration. 
     
    21272239        set_default -- boolean to specify whether to use this as the 
    21282240                       default account. 
     2241        cb          -- AccountCallback instance. 
    21292242 
    21302243        Return: 
     
    21322245 
    21332246        """ 
     2247        lck = self.auto_lock() 
    21342248        err, acc_id = _pjsua.acc_add(acc_config._cvt_to_pjsua(), set_default) 
    21352249        self._err_check("create_account()", self, err) 
    2136         return Account(self, acc_id) 
    2137  
    2138     def create_account_for_transport(self, transport, set_default=True): 
     2250        return Account(self, acc_id, cb) 
     2251 
     2252    def create_account_for_transport(self, transport, set_default=True, 
     2253                                     cb=None): 
    21392254        """Create a new local pjsua transport for the specified transport. 
    21402255 
     
    21432258        set_default -- boolean to specify whether to use this as the 
    21442259                       default account. 
     2260        cb          -- AccountCallback instance. 
    21452261 
    21462262        Return: 
     
    21482264 
    21492265        """ 
     2266        lck = self.auto_lock() 
    21502267        err, acc_id = _pjsua.acc_add_local(transport._id, set_default) 
    21512268        self._err_check("create_account_for_transport()", self, err) 
    2152         return Account(self, acc_id) 
     2269        return Account(self, acc_id, cb) 
    21532270 
    21542271    def hangup_all(self): 
     
    21562273 
    21572274        """ 
     2275        lck = self.auto_lock() 
    21582276        _pjsua.call_hangup_all() 
    21592277 
     
    21672285            the device ID for the device. 
    21682286        """ 
     2287        lck = self.auto_lock() 
    21692288        sdi_list = _pjsua.enum_snd_devs() 
    21702289        info = [] 
     
    21792298            (capture_dev_id, playback_dev_id) tuple 
    21802299        """ 
     2300        lck = self.auto_lock() 
    21812301        return _pjsua.get_snd_dev() 
    21822302 
     
    21892309 
    21902310        """ 
     2311        lck = self.auto_lock() 
    21912312        err = _pjsua.set_snd_dev(capture_dev, playback_dev) 
    21922313        self._err_check("set_current_sound_devices()", self, err) 
     
    21972318 
    21982319        """ 
     2320        lck = self.auto_lock() 
    21992321        err = _pjsua.set_null_snd_dev() 
    22002322        self._err_check("set_null_snd_dev()", self, err) 
     
    22102332 
    22112333        """ 
     2334        lck = self.auto_lock() 
    22122335        return _pjsua.conf_get_max_ports() 
    22132336 
     
    22312354 
    22322355        """ 
     2356        lck = self.auto_lock() 
    22332357        err = _pjsua.conf_connect(src_slot, dst_slot) 
    22342358        self._err_check("conf_connect()", self, err) 
     
    22442368 
    22452369        """ 
     2370        lck = self.auto_lock() 
    22462371        err = _pjsua.conf_disconnect(src_slot, dst_slot) 
    22472372        self._err_check("conf_disconnect()", self, err) 
     
    22562381                       adjustment, while value 0 means to mute the port. 
    22572382        """ 
     2383        lck = self.auto_lock() 
    22582384        err = _pjsua.conf_set_tx_level(slot, level) 
    22592385        self._err_check("conf_set_tx_level()", self, err) 
     
    22682394                       adjustment, while value 0 means to mute the port. 
    22692395        """ 
     2396        lck = self.auto_lock() 
    22702397        err = _pjsua.conf_set_rx_level(slot, level) 
    22712398        self._err_check("conf_set_rx_level()", self, err) 
     
    22832410            (tx_level, rx_level) tuple. 
    22842411        """ 
     2412        lck = self.auto_lock() 
    22852413        err, tx_level, rx_level = _pjsua.conf_get_signal_level(slot) 
    22862414        self._err_check("conf_get_signal_level()", self, err) 
     
    22982426 
    22992427        """ 
     2428        lck = self.auto_lock() 
    23002429        ci_list = _pjsua.enum_codecs() 
    23012430        codec_info = [] 
     
    23142443 
    23152444        """ 
     2445        lck = self.auto_lock() 
    23162446        err = _pjsua.codec_set_priority(name, priority) 
    23172447        self._err_check("set_codec_priority()", self, err) 
     
    23242454 
    23252455        """ 
     2456        lck = self.auto_lock() 
    23262457        cp = _pjsua.codec_get_param(name) 
    23272458        if not cp: 
     
    23382469 
    23392470        """ 
     2471        lck = self.auto_lock() 
    23402472        err = _pjsua.codec_set_param(name, param._cvt_to_pjsua()) 
    23412473        self._err_check("set_codec_parameter()", self, err) 
     
    23542486 
    23552487        """ 
     2488        lck = self.auto_lock() 
    23562489        opt = 0 
    23572490        if not loop: 
     
    23712504 
    23722505        """ 
     2506        lck = self.auto_lock() 
    23732507        slot = _pjsua.player_get_conf_port(player_id) 
    23742508        if slot < 0: 
     
    23852519 
    23862520        """ 
     2521        lck = self.auto_lock() 
    23872522        err = _pjsua.player_set_pos(player_id, pos) 
    23882523        self._err_check("player_set_pos()", self, err) 
     
    23952530 
    23962531        """ 
     2532        lck = self.auto_lock() 
    23972533        err = _pjsua.player_destroy(player_id) 
    23982534        self._err_check("player_destroy()", self, err) 
     
    24112547            playlist_id 
    24122548        """ 
     2549        lck = self.auto_lock() 
    24132550        opt = 0 
    24142551        if not loop: 
     
    24282565 
    24292566        """ 
     2567        lck = self.auto_lock() 
    24302568        slot = _pjsua.player_get_conf_port(playlist_id) 
    24312569        if slot < 0: 
     
    24412579 
    24422580        """ 
     2581        lck = self.auto_lock() 
    24432582        err = _pjsua.player_destroy(playlist_id) 
    24442583        self._err_check("playlist_destroy()", self, err) 
     
    24542593 
    24552594        """ 
     2595        lck = self.auto_lock() 
    24562596        err, rec_id = _pjsua.recorder_create(filename, 0, None, -1, 0) 
    24572597        self._err_check("create_recorder()", self, err) 
     
    24682608 
    24692609        """ 
     2610        lck = self.auto_lock() 
    24702611        slot = _pjsua.recorder_get_conf_port(rec_id) 
    24712612        if slot < 1: 
     
    24812622 
    24822623        """ 
     2624        lck = self.auto_lock() 
    24832625        err = _pjsua.recorder_destroy(rec_id) 
    24842626        self._err_check("recorder_destroy()", self, err) 
     
    25032645        return msg_data 
    25042646     
     2647    def auto_lock(self): 
     2648        return _LibMutex(self._lock) 
     2649 
    25052650    # Internal dictionary manipulation for calls, accounts, and buddies 
    25062651 
    2507     def _associate_call(self, call_id, call): 
    2508         self.call[call_id] = call 
    2509  
    25102652    def _lookup_call(self, call_id): 
    2511         return self.call.has_key(call_id) and self.call[call_id] or None 
    2512  
    2513     def _disassociate_call(self, call): 
    2514         if self._lookup_call(call._id)==call: 
    2515             del self.call[call._id] 
    2516  
    2517     def _associate_account(self, acc_id, account): 
    2518         self.account[acc_id] = account 
     2653        return _pjsua.call_get_user_data(call_id) 
    25192654 
    25202655    def _lookup_account(self, acc_id): 
    2521         return self.account.has_key(acc_id) and self.account[acc_id] or None 
    2522  
    2523     def _disassociate_account(self, account): 
    2524         if self._lookup_account(account._id)==account: 
    2525             del self.account[account._id] 
    2526  
    2527     def _associate_buddy(self, buddy_id, buddy): 
    2528         self.buddy[buddy_id] = buddy 
    2529         uri = SIPUri(buddy.info().uri) 
    2530         self.buddy_by_uri[(uri.user, uri.host)] = buddy 
     2656        return _pjsua.acc_get_user_data(acc_id) 
    25312657 
    25322658    def _lookup_buddy(self, buddy_id, uri=None): 
    2533         buddy = self.buddy.has_key(buddy_id) and self.buddy[buddy_id] or None 
    2534         if uri and not buddy: 
    2535             sip_uri = SIPUri(uri) 
    2536             buddy = self.buddy_by_uri.has_key( (sip_uri.user, sip_uri.host) ) \ 
    2537                     and self.buddy_by_uri[(sip_uri.user, sip_uri.host)] or \ 
    2538                     None 
     2659        if buddy_id != -1: 
     2660            buddy = _pjsua.buddy_get_user_data(buddy_id) 
     2661        elif uri: 
     2662            buddy_id = _pjsua.buddy_find(uri) 
     2663            if buddy_id != -1: 
     2664                buddy = _pjsua.buddy_get_user_data(buddy_id) 
     2665            else: 
     2666                buddy = None 
     2667        else: 
     2668            buddy = None 
     2669             
    25392670        return buddy  
    2540  
    2541     def _disassociate_buddy(self, buddy): 
    2542         if self._lookup_buddy(buddy._id)==buddy: 
    2543             del self.buddy[buddy._id] 
    2544         if self.buddy_by_uri.has_key(buddy.info().uri): 
    2545             del self.buddy_by_uri[buddy.info().uri] 
    25462671 
    25472672    # Account allbacks 
     
    25522677            acc._cb.on_reg_state() 
    25532678 
    2554     def _cb_on_incoming_subscribe(self, acc_id, buddy_id, from_uri, pres_obj): 
     2679    def _cb_on_incoming_subscribe(self, acc_id, buddy_id, from_uri,  
     2680                                  contact_uri, pres_obj): 
    25552681        acc = self._lookup_account(acc_id) 
    25562682        if acc: 
    25572683            buddy = self._lookup_buddy(buddy_id) 
    2558             return acc._cb.on_incoming_subscribe(buddy, from_uri, pres_obj) 
     2684            return acc._cb.on_incoming_subscribe(buddy, from_uri, contact_uri, 
     2685                                                 pres_obj) 
    25592686        else: 
    25602687            return (404, None) 
     
    25722699        call = self._lookup_call(call_id) 
    25732700        if call: 
     2701            if call._id == -1: 
     2702                call.attach_to_id(call_id) 
     2703            done = (call.info().state == CallState.DISCONNECTED) 
    25742704            call._cb.on_state() 
     2705            if done: 
     2706                _pjsua.call_set_user_data(call_id, 0) 
     2707        else: 
     2708            pass 
    25752709 
    25762710    def _cb_on_call_media_state(self, call_id): 
     
    26952829    _lib._cb_on_reg_state(acc_id) 
    26962830 
    2697 def _cb_on_incoming_subscribe(acc_id, buddy_id, from_uri, pres): 
    2698     return _lib._cb_on_incoming_subscribe(acc_id, buddy_id, from_uri, pres) 
     2831def _cb_on_incoming_subscribe(acc_id, buddy_id, from_uri, contact_uri, pres): 
     2832    return _lib._cb_on_incoming_subscribe(acc_id, buddy_id, from_uri,  
     2833                                          contact_uri, pres) 
    26992834 
    27002835def _cb_on_buddy_state(buddy_id): 
     
    27182853    err = _pjsua.thread_register("python worker", thread_desc) 
    27192854    _lib._err_check("thread_register()", _lib, err) 
    2720     while _lib._quit == 0: 
    2721         _pjsua.handle_events(50) 
    2722     _lib._quit = 2 
    2723  
    2724  
     2855    while _lib and _lib._quit == 0: 
     2856        _lib.handle_events(50) 
     2857    if _lib: 
     2858        _lib._quit = 2 
     2859 
     2860def _Trace(args): 
     2861    if True: 
     2862        print "** ", 
     2863        for arg in args: 
     2864            print arg, 
     2865        print " **" 
Note: See TracChangeset for help on using the changeset viewer.