Ignore:
Timestamp:
Jul 17, 2013 8:20:50 PM (9 years ago)
Author:
nanang
Message:

JNI projects:

  • More work on callbacks wrapper, i.e: pj_timer_heap_callback for pjsua_schedule_timer() and pjsua_logging_config::cb.
  • Map pjsua_call_dump() output buffer.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/jni/pjsip-apps/src/jni/swig_gen.py

    r4563 r4566  
    1313#SOURCE_PATH  = PJ_ROOT_PATH + "pjlib-util/include/pjlib-util/scanner.h" 
    1414#SOURCE_PATH  = PJ_ROOT_PATH + "pjlib/include/pj/types.h" 
     15OUTDIR = "output" if len(sys.argv)<=1 else sys.argv[1] 
     16 
    1517 
    1618# CPP is needed by pycparser. 
     
    6264        'pjsip_rx_data_op_key', 
    6365        'pjsip_module', 
     66        'pjsip_uri', 
     67        'pjsip_uri_vptr', 
    6468        'pjmedia_port', 
    6569        'pjmedia_transport', 
     
    7276 
    7377class MyGen(c_generator.CGenerator): 
    74          
     78 
    7579        def __init__(self, ast): 
    7680                super(MyGen, self).__init__() 
     
    8690                        if name and not name.startswith(BASE_PREFIX): 
    8791                                continue 
    88                  
     92 
    8993                        if name in self.nodes: 
    9094                                self.nodes[name].append(ext) 
     
    9498                        else: 
    9599                                self.nodes[name] = [ext] 
    96                                  
     100 
    97101                # Generate dependencies, they are all APIs to be exported 
    98102                for name in self.nodes.keys(): 
     
    102106                                self._add_dep(name) 
    103107                self.deps_frozen = True 
    104          
     108 
    105109        # Override visit_IdentifierType() to collect "node name" and generate dependencies 
    106110        # from this node's children 
     
    114118                        return False 
    115119                return True 
    116          
     120 
    117121        def _get_node_name(self, node): 
    118122                s = getattr(node, 'name', None) 
     
    135139                        name in self.deps or name in self.deps_pending: 
    136140                        return 
    137                          
     141 
    138142                if name in FORCE_STRUCT_AS_OPAQUE: 
    139143                        self.deps.append(name) 
    140144                        return 
    141                          
     145 
    142146                self.deps_pending.append(name) 
    143147                for node in self.nodes[name]: 
     
    147151                        sys.exit(1) 
    148152                self.deps.append(name) 
    149                  
     153 
    150154        # Opaque struct is identified by empty struct member declaration. 
    151155        def _is_struct_opaque(self, node): 
     
    177181                        code = code.replace('typedef enum '+name+' '+name+';\n', '', 1) 
    178182                return code 
    179          
    180         def _gen_pjsua_callback(self): 
     183 
     184        def _gen_pjsua_callback(self, code): 
    181185                # init 
    182186                cbclass  = '' 
     
    184188                cbdef = [] 
    185189 
    186                 n = self.nodes['pjsua_callback'][0] 
    187                 raw_lines = self._print_node(n).splitlines() 
     190                raw_lines = code.splitlines() 
    188191                for idx, line in enumerate(raw_lines): 
    189192                        if idx in [0, 1, len(raw_lines)-1]: continue 
     
    208211                                fstrs[0] = m.group(1).strip() 
    209212                                fstrs[2] = m.group(3) 
    210                  
     213 
    211214                        cbclass += '  virtual ' + ' '.join(fstrs) 
    212215                        if fstrs[0] == 'void': 
     
    227230 
    228231                        cbdef.append('  &' + fstrs[1]) 
    229                                  
    230                 # trail  
    231                  
     232 
    232233                return [cbclass, cbproxy, ',\n'.join(cbdef)+'\n'] 
    233          
     234 
     235        def _process_pjsua_callback(self, name, code): 
     236                if name != 'pjsua_callback': 
     237                        return code 
     238 
     239                cb = self._gen_pjsua_callback(code) 
     240 
     241                fout = open(OUTDIR+'/callbacks.h', 'w+') 
     242                fin  = open('callbacks.h.template', 'r') 
     243                for line in fin: 
     244                        if line.find(r'$PJSUA_CALLBACK_CLASS$') >= 0: 
     245                                fout.write(cb[0]) 
     246                        else: 
     247                                fout.write(line) 
     248                fin.close() 
     249                fout.close() 
     250 
     251                fout = open(OUTDIR+'/callbacks.c', 'w+') 
     252                fin  = open('callbacks.c.template', 'r') 
     253                for line in fin: 
     254                        if line.find(r'$PJSUA_CALLBACK_PROXY$') >= 0: 
     255                                fout.write(cb[1]) 
     256                        elif line.find(r'$PJSUA_CALLBACK_DEF$') >= 0: 
     257                                fout.write(cb[2]) 
     258                        else: 
     259                                fout.write(line) 
     260                fin.close() 
     261                fout.close() 
     262                return '' 
     263 
    234264        # Generate code from the specified node. 
    235265        def _print_node(self, node): 
     
    248278                        for node in self.nodes[name]: 
    249279                                ss += self._print_node(node) 
    250                         s += self._process_opaque_struct(name, ss) 
     280 
     281                        ss = self._process_opaque_struct(name, ss) 
     282                        ss = self._process_pjsua_callback(name, ss) 
     283                        s += ss 
    251284                return s 
    252          
    253         def write_pjsua_callback(self, outdir): 
    254                 cb = self._gen_pjsua_callback() 
    255                  
    256                 fout = open(outdir+'/callbacks.h', 'w+') 
    257                 fin  = open('callbacks.h.template', 'r') 
    258                 for line in fin: 
    259                         if line.find(r'$PJSUA_CALLBACK_CLASS$') >= 0: 
    260                                 fout.write(cb[0]) 
    261                         else: 
    262                                 fout.write(line) 
    263                 fin.close() 
    264                 fout.close() 
    265  
    266                 fout = open(outdir+'/callbacks.c', 'w+') 
    267                 fin  = open('callbacks.c.template', 'r') 
    268                 for line in fin: 
    269                         if line.find(r'$PJSUA_CALLBACK_PROXY$') >= 0: 
    270                                 fout.write(cb[1]) 
    271                         elif line.find(r'$PJSUA_CALLBACK_DEF$') >= 0: 
    272                                 fout.write(cb[2]) 
    273                         else: 
    274                                 fout.write(line) 
    275                 fin.close() 
    276                 fout.close() 
     285 
    277286 
    278287# MAIN                   
     
    291300#   print d 
    292301 
    293 sys.argv.pop(0) 
    294 outdir = sys.argv.pop() if len(sys.argv) else 'output' 
    295 mygen.write_pjsua_callback(outdir) 
    296  
    297302s = mygen.go() 
    298303print s 
Note: See TracChangeset for help on using the changeset viewer.