Changeset 4570


Ignore:
Timestamp:
Jul 19, 2013 10:32:43 AM (11 years ago)
Author:
nanang
Message:

JNI projects: handle nested struct/union for SWIG

Location:
pjproject/branches/projects/jni
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/jni/pjsip-apps/src/jni/jni/callbacks.i

    r4568 r4570  
    5757%ignore pjsip_tx_data::cb; 
    5858%ignore pjsip_transaction::state_handler; 
     59 
     60/* Ignore some struct members with aux credential callbacks, at least temporarily */ 
     61%ignore pjsip_cred_info::ext; 
     62%ignore pjsip_cred_info_ext; 
     63%ignore pjsip_cred_info_ext_aka; 
     64 
     65%ignore pj_stun_auth_cred::data::dyn_cred; 
     66%ignore pj_stun_auth_cred_data::dyn_cred; 
     67%ignore pj_stun_auth_cred_data_dyn_cred; 
  • pjproject/branches/projects/jni/pjsip-apps/src/jni/jni/header.i

    r4568 r4570  
    7878MY_JAVA_MEMBER_ARRAY_OF_POINTER(pjmedia_sdp_media, pjmedia_sdp_attr, attr, attr_count) 
    7979 
    80 /* C++ SWIG target doesn't support nested class (C version does though!). 
    81  * This is minimal workaround, ignore nested class as if it is not there. 
    82  * TODO: proper workaround will be moving out inner classes to global scope. 
    83  */ 
    84 #ifdef __cplusplus 
    85     %nestedworkaround pjmedia_codec_fmtp::param; 
    86     %nestedworkaround pjsip_cred_info::ext; 
    87     %nestedworkaround pjsip_event::body; 
    88 #endif 
    89  
    9080%include "../callbacks.i" 
    9181 
  • pjproject/branches/projects/jni/pjsip-apps/src/jni/jni/my_typemaps.i

    r4568 r4570  
    1414}; 
    1515%} 
     16 
     17/* 
     18 * Typemap for setting member of inner struct/union. 
     19 */ 
     20%typemap(memberin) NESTED_INNER "if ($input) pj_memcpy(&$1, $input, sizeof(*$input));" 
     21 
    1622 
    1723/* 
  • pjproject/branches/projects/jni/pjsip-apps/src/jni/jni/swig_gen.py

    r4568 r4570  
    262262                return '' 
    263263 
     264 
     265        # Move out inner struct/union 
     266        def _process_nested_struct_union(self, code): 
     267                if not (code.startswith('struct') or \ 
     268                        code.startswith('typedef struct') or \ 
     269                        code.startswith('typedef union')): 
     270                        return code 
     271                         
     272                # max nested level is 5 
     273                name = ['','','','',''] 
     274                type = ['','','','',''] 
     275                content = ['','','','',''] 
     276                level = 0 
     277                s = '' 
     278                for line in code.splitlines(): 
     279                        line_s = line.lstrip() 
     280                        if (not line_s) or (line_s == '{'): continue 
     281 
     282                        last_level = level 
     283                        level = (len(line) - len(line_s)) / 2 
     284 
     285                        if level < last_level: 
     286                                if not line_s.startswith('}'): 
     287                                        print "bad tabulation!" 
     288 
     289                                # closing bracket, get var name 
     290                                varname = '' 
     291                                vartail = '' 
     292                                m = re.match(r'\}\s*(\w+)(.*);', line_s) 
     293                                if m: 
     294                                        varname = m.group(1) 
     295                                        vartail = m.group(2) 
     296                                        if level > 0: 
     297                                                name[level] = '$name' + str(level-1) + '$_' + varname 
     298                                # print inner struct/union in outer 
     299                                ss = type[level] + ' ' + name[level] + '\n' 
     300                                ss += '{\n' + content[level] + '};\n' 
     301                                if level > 0: 
     302                                        s += "%inline %{\n" + ss + '%}\n' 
     303                                        s += "%apply NESTED_INNER { " + name[level] + " " + varname + " };\n" 
     304                                else: 
     305                                        s += ss 
     306                                content[level] = '' 
     307                                # print inner struct member var at global scope 
     308                                if level > 0: 
     309                                        content[level-1] += ' '*level*2 + type[level] + ' ' + name[level] + ' ' + varname + vartail + ';\n' 
     310                                        s = s.replace('$name' + str(level) + '$', '$name' + str(level-1) + '$_' + varname) 
     311                                else: 
     312                                        s = s.replace('$name' + str(level) + '$', name[level]) 
     313 
     314                        elif level >= last_level: 
     315                                if line_s.startswith('typedef'): line_s = line_s[8:] 
     316                                if (line_s.startswith('union') or line_s.startswith('struct')) and not line_s.endswith(';'): 
     317                                        ll = line_s.split() 
     318                                        type[level] = ll[0] 
     319                                        name[level] = ll[1] if len(ll) > 1 else '' 
     320                                else: 
     321                                        content[level-1] += line + '\n' 
     322                return s 
     323                 
     324 
    264325        # Generate code from the specified node. 
    265326        def _print_node(self, node): 
     
    281342                        ss = self._process_opaque_struct(name, ss) 
    282343                        ss = self._process_pjsua_callback(name, ss) 
     344                        ss = self._process_nested_struct_union(ss) 
    283345                        s += ss 
    284346                return s 
  • pjproject/branches/projects/jni/pjsip-apps/src/jni/src/org/pjsip/hello/hello.java

    r4568 r4570  
    4747        public void on_log(int level, String data) 
    4848        { 
    49                 System.out.print("LOG: " + data); 
     49                System.out.print("LOG" + level + ": " + data); 
    5050        } 
    5151} 
     
    7474                pjsua.destroy(); 
    7575                System.exit(status); 
     76        } 
     77         
     78        protected static boolean check_active_call() { 
     79                if (app_config.cur_call_id == -1) 
     80                        System.out.println("No active call"); 
     81                return (app_config.cur_call_id > -1); 
    7682        } 
    7783 
     
    192198                                pjsua.dump(true); 
    193199                        } else if (userInput.equals("dq")) { 
    194                                 if (app_config.cur_call_id == -1) { 
    195                                         System.out.println("No active call"); 
    196                                         continue; 
    197                                 } 
     200                                if (!check_active_call()) continue; 
    198201                                 
    199202                                byte[] buf = new byte[1024*2]; 
     
    207210                                System.out.println("Statistics of call " + app_config.cur_call_id); 
    208211                                System.out.println(call_dump); 
     212                        } else if (userInput.equals("si")) { 
     213                                /* Test nested struct in pjsua_stream_info */ 
     214                                if (!check_active_call()) continue; 
     215 
     216                                pjsua_stream_info si = new pjsua_stream_info(); 
     217                                pjsua.call_get_stream_info(app_config.cur_call_id, 0, si); 
     218                                System.out.println("Audio codec being used: " + si.getInfo().getAud().getFmt().getEncoding_name()); 
    209219                        } 
    210220                } 
  • pjproject/branches/projects/jni/pjsip/include/pjsip/sip_msg.h

    r3553 r4570  
    790790    { 
    791791        /** Request Line. */ 
    792         struct pjsip_request_line   req; 
     792        pjsip_request_line   req; 
    793793 
    794794        /** Status Line. */ 
    795         struct pjsip_status_line    status; 
     795        pjsip_status_line    status; 
    796796    } line; 
    797797 
Note: See TracChangeset for help on using the changeset viewer.