Ignore:
Timestamp:
Nov 6, 2013 8:14:17 AM (11 years ago)
Author:
bennylp
Message:

Re #1519: persistent support in PyGui? application, making use of the new persistent API in pjsua2

Location:
pjproject/branches/projects/pjsua2/pjsip-apps/src/pygui
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/pjsua2/pjsip-apps/src/pygui

    • Property svn:ignore
      •  

        old new  
        11pygui.log 
        22pygui.dat 
         3pygui.js 
  • pjproject/branches/projects/pjsua2/pjsip-apps/src/pygui/application.py

    r4640 r4648  
    3636 
    3737import os 
    38 import pickle 
    3938import traceback 
    4039 
    41 #---------------------------------------------------------- 
    42 # Unfortunately SWIG classes cannot be serialized directly 
    43 # hence need to write these config classes 
    44 # 
    45 class AccountConfig: 
    46         """ 
    47         "Proxy" for the pj.AccountConfig class, serializable 
    48         """ 
    49         def __init__(self, acc_cfg = None): 
    50                 if not acc_cfg: 
    51                         acc_cfg = pj.AccountConfig() 
    52                 self.priority   = acc_cfg.priority 
    53                 self.idUri      = acc_cfg.idUri 
    54                 self.regUri     = acc_cfg.regConfig.registrarUri 
    55                 self.registerOnAdd = acc_cfg.regConfig.registerOnAdd 
    56                 self.proxies    = [proxy for proxy in acc_cfg.sipConfig.proxies] 
    57                 self.userName   = "" 
    58                 self.password   = "" 
    59                 if len(acc_cfg.sipConfig.authCreds): 
    60                         self.userName = acc_cfg.sipConfig.authCreds[0].username 
    61                         self.password = acc_cfg.sipConfig.authCreds[0].data 
    62  
    63         def getAccConfig(self, acc_cfg = None): 
    64                 """ 
    65                 Convert this class to pj.AccountConfig class 
    66                 """ 
    67                 if not acc_cfg: 
    68                         acc_cfg  = pj.AccountConfig() 
    69                 acc_cfg.priority = self.priority 
    70                 acc_cfg.idUri    = self.idUri 
    71                 acc_cfg.regConfig.registrarUri = self.regUri 
    72                 acc_cfg.regConfig.registerOnAdd = self.registerOnAdd 
    73                 for proxy in self.proxies: 
    74                         acc_cfg.sipConfig.proxies.append(proxy) 
    75                 if self.userName: 
    76                         cred = pj.AuthCredInfo() 
    77                         cred.scheme     = "digest" 
    78                         cred.realm      = "*" 
    79                         cred.username   = self.userName 
    80                         cred.data       = self.password 
    81                         acc_cfg.sipConfig.authCreds.append(cred) 
    82                 return acc_cfg 
    83                  
    84 class ApplicationConfig: 
    85         """ 
    86         Application config is serializable and contains all settings that application need. 
    87         """ 
    88         def __init__(self, ep_cfg = None, acc_cfgs = []): 
    89                 if not ep_cfg: 
    90                         ep_cfg = pj.EpConfig() 
    91                  
    92                 self.logFile    = ep_cfg.logConfig.filename 
    93                 self.logFlags   = ep_cfg.logConfig.fileFlags 
    94                 self.logLevel   = ep_cfg.logConfig.consoleLevel 
    95                  
    96                 self.accCfgs = [] 
    97                 for acc_cfg in acc_cfgs: 
    98                         self.accCfgs.append( AccountConfig(acc_cfg) ) 
    99                  
    100         def getEpConfig(self, ep_cfg = None): 
    101                 if not ep_cfg: 
    102                         ep_cfg = pj.EpConfig() 
    103                 ep_cfg.logConfig.filename = self.logFile  
    104                 ep_cfg.logConfig.fileFlags = self.logFlags  
    105                 ep_cfg.logConfig.consoleLevel = self.logLevel 
    106                 return ep_cfg 
    107  
    108                  
    109 #---------------------------------------------------------- 
    110  
    111                  
     40class SipTransportConfig: 
     41        def __init__(self): 
     42                #pj.PersistentObject.__init__(self) 
     43                self.type = pj.PJSIP_TRANSPORT_UNSPECIFIED; 
     44                self.cfg = pj.TransportConfig() 
     45                 
     46        def readObject(self, node): 
     47                child_node = node.readContainer("SipTransportConfig") 
     48                self.type = child_node.readInt("type") 
     49                self.cfg.readObject(child_node) 
     50         
     51        def writeObject(self, node): 
     52                child_node = node.writeNewContainer("SipTransportConfig") 
     53                child_node.writeInt("type", self.type) 
     54                self.cfg.writeObject(child_node) 
     55          
     56         
    11257class Application(ttk.Frame): 
    11358        """ 
     
    12267                self.logger = log.Logger() 
    12368                 
    124                 # Global config, fill with default 
     69                # Accounts 
     70                self.accList = [] 
     71                 
     72                # GUI variables 
     73                self.showLogWindow = tk.IntVar() 
     74                self.showLogWindow.set(1) 
     75                self.quitting = False  
     76                 
     77                # Construct GUI 
     78                self._createWidgets() 
     79                 
     80                # Log window 
     81                self.logWindow = log.LogWindow(self) 
     82                self._onMenuShowHideLogWindow() 
     83                 
     84                # Instantiate endpoint 
     85                self.ep = endpoint.Endpoint() 
     86                self.ep.libCreate() 
     87                 
     88                # Default config 
    12589                self.epCfg = pj.EpConfig() 
    12690                self.epCfg.uaConfig.threadCnt = 0; 
     
    13195                self.epCfg.logConfig.consoleLevel = 5 
    13296                 
    133                 # Accounts 
    134                 self.accList = [] 
    135                  
    136                 # GUI variables 
    137                 self.showLogWindow = tk.IntVar() 
    138                 self.showLogWindow.set(1) 
    139                 self.quitting = False  
    140                  
    141                 # Construct GUI 
    142                 self._createWidgets() 
    143                  
    144                 # Log window 
    145                 self.logWindow = log.LogWindow(self) 
    146                 self._onMenuShowHideLogWindow() 
    147                  
    148         def saveConfig(self, filename='pygui.dat'): 
    149                 acc_cfgs = [acc.cfg for acc in self.accList] 
    150                 app_cfg = ApplicationConfig(self.epCfg, acc_cfgs) 
    151                 f = open(filename, 'wb') 
    152                 pickle.dump(app_cfg, f, 0) 
    153                 f.close() 
    154          
    155         def start(self, cfg_file='pygui.dat'): 
     97                self.transportCfgs = [] 
     98                t = SipTransportConfig() 
     99                t.type = pj.PJSIP_TRANSPORT_UDP 
     100                t.cfg.port = 0 
     101                self.transportCfgs.append(t) 
     102                 
     103         
     104        def saveConfig(self, filename='pygui.js'): 
     105                json = pj.JsonDocument() 
     106                 
     107                # Write endpoint config 
     108                json.writeObject(self.epCfg) 
     109                 
     110                # Write transport config 
     111                node = json.writeNewArray("transports") 
     112                for t in self.transportCfgs: 
     113                        t.writeObject(node); 
     114                 
     115                # Write account configs 
     116                node = json.writeNewArray("accounts") 
     117                for acc in self.accList: 
     118                        node.writeObject(acc.cfg); 
     119                json.saveFile(filename) 
     120         
     121        def start(self, cfg_file='pygui.js'): 
    156122                # Load config 
    157123                acc_cfgs = [] 
    158124                if cfg_file and os.path.exists(cfg_file): 
    159                         f = open(cfg_file, 'rb') 
    160                         app_cfg = pickle.load(f) 
    161                         app_cfg.getEpConfig(self.epCfg) 
    162                         for c in app_cfg.accCfgs: 
    163                                 cfg = c.getAccConfig() 
     125                        json = pj.JsonDocument() 
     126                        json.loadFile(cfg_file) 
     127                         
     128                        # Load endpoint config 
     129                        json.readObject(self.epCfg) 
     130                         
     131                        # Load transport configs 
     132                        node = json.readArray("transports") 
     133                        if node.hasUnread(): 
     134                                self.transportCfgs = [] 
     135                                while node.hasUnread(): 
     136                                        t = SipTransportConfig() 
     137                                        t.readObject(node) 
     138                                        self.transportCfgs.append(t) 
     139                         
     140                        # Load account configs 
     141                        node = json.readArray("accounts") 
     142                        while node.hasUnread(): 
     143                                cfg = pj.AccountConfig() 
     144                                cfg.readObject(node) 
    164145                                acc_cfgs.append(cfg) 
    165                         f.close() 
    166                  
    167                 # Instantiate endpoint 
    168                 self.ep = endpoint.Endpoint() 
     146                 
     147                # Initialize library 
    169148                self.epCfg.uaConfig.userAgent = "pygui-" + self.ep.libVersion().full; 
    170                 self.ep.startLib(self.epCfg) 
     149                self.ep.libInit(self.epCfg) 
    171150                self.master.title('pjsua2 Demo version ' + self.ep.libVersion().full) 
    172151                 
     152                # Create transports 
     153                for t in self.transportCfgs: 
     154                        self.ep.transportCreate(t.type, t.cfg) 
     155                         
    173156                # Add accounts 
    174157                for cfg in acc_cfgs: 
    175158                        self._createAcc(cfg) 
     159                 
     160                # Start library 
     161                self.ep.libStart() 
    176162                 
    177163                # Start polling 
     
    329315                         
    330316        def _onClose(self): 
     317                self.saveConfig() 
    331318                self.quitting = True 
    332                 self.ep.stopLib() 
     319                self.ep.libDestroy() 
    333320                self.ep = None 
    334321                self.update() 
     
    391378        app.start() 
    392379        app.mainloop() 
    393         app.saveConfig() 
    394380                 
    395381if __name__ == '__main__': 
Note: See TracChangeset for help on using the changeset viewer.