+ for cl, rtype, method, params, comment in el:
+ if method in blacklist:
+ continue
+ # Strip prefix
+ name=method.replace(prefix, '').replace('libvlc_', '')
+ ret.add(method)
+ if name in overriden_methods.get(cl, []):
+ # Method already defined in override.py
+ continue
+
+ if params:
+ params[0]=(params[0][0], 'self')
+ if params and params[-1][0] in ('libvlc_exception_t*', 'mediacontrol_Exception*'):
+ args=", ".join( p[1] for p in params[:-1] )
+ else:
+ args=", ".join( p[1] for p in params )
+
+ self.output(" if hasattr(dll, '%s'):" % method)
+ self.output(" def %s(%s):" % (name, args))
+ self.output(' """%s\n """' % self.fix_python_comment(comment))
+ if params and params[-1][0] == 'libvlc_exception_t*':
+ # Exception handling
+ self.output(" e=VLCException()")
+ self.output(" return %s(%s, e)" % (method, args))
+ elif params and params[-1][0] == 'mediacontrol_Exception*':
+ # Exception handling
+ self.output(" e=MediaControlException()")
+ self.output(" return %s(%s, e)" % (method, args))
+ else:
+ self.output(" return %s(%s)" % (method, args))
+ self.output()
+
+ # Check for standard methods
+ if name == 'count':
+ # There is a count method. Generate a __len__ one.
+ if params and params[-1][0] == 'libvlc_exception_t*':
+ self.output(""" def __len__(self):
+ e=VLCException()
+ return %s(self, e)
+""" % method)
+ else:
+ # No exception
+ self.output(""" def __len__(self):
+ return %s(self)
+""" % method)
+ elif name.endswith('item_at_index'):
+ # Indexable (and thus iterable)"
+ self.output(""" def __getitem__(self, i):
+ e=VLCException()
+ return %s(self, i, e)
+
+ def __iter__(self):
+ e=VLCException()
+ for i in xrange(len(self)):
+ yield self[i]
+""" % method)
+ return ret
+
+class JavaGenerator(object):
+ # C-type to java/jna type conversion.
+ # Note that enum types conversions are generated (cf convert_enum_names)
+ type2class={
+ 'libvlc_exception_t*': 'libvlc_exception_t',
+ 'libvlc_media_player_t*': 'LibVlcMediaPlayer',
+ 'libvlc_instance_t*': 'LibVlcInstance',
+ 'libvlc_media_t*': 'LibVlcMedia',
+ 'libvlc_log_t*': 'LibVlcLog',
+ 'libvlc_log_iterator_t*': 'LibVlcLogIterator',
+ 'libvlc_log_message_t*': 'libvlc_log_message_t',
+ 'libvlc_event_type_t': 'int',
+ 'libvlc_event_manager_t*': 'LibVlcEventManager',
+ 'libvlc_media_discoverer_t*': 'LibVlcMediaDiscoverer',
+ 'libvlc_media_library_t*': 'LibVlcMediaLibrary',
+ 'libvlc_media_list_t*': 'LibVlcMediaList',
+ 'libvlc_media_list_player_t*': 'LibVlcMediaListPlayer',
+ 'libvlc_media_list_view_t*': 'LibVlcMediaListView',
+
+ 'libvlc_track_description_t*': 'LibVlcTrackDescription',
+ 'libvlc_audio_output_t*': 'LibVlcAudioOutput',
+
+ 'void': 'void',
+ 'void*': 'Pointer',
+ 'short': 'short',
+ 'char*': 'String',
+ 'char**': 'String[]',
+ 'uint32_t': 'uint32',
+ 'float': 'float',
+ 'unsigned': 'int',
+ 'int': 'int',
+ '...': 'FIXMEva_list',
+ 'libvlc_callback_t': 'LibVlcCallback',
+ 'libvlc_time_t': 'long',
+
+ 'mediacontrol_RGBPicture*': 'Pointer',
+ 'mediacontrol_PlaylistSeq*': 'Pointer',
+ 'mediacontrol_StreamInformation*': 'Pointer',
+ }
+
+ def __init__(self, parser=None):
+ self.parser=parser
+
+ # Blacklist all mediacontrol methods
+ for (rt, met, params, c) in self.parser.methods:
+ if met.startswith('mediacontrol'):
+ blacklist.append(met)
+ # Generate Java names for enums
+ self.type2class.update(self.convert_enum_names(parser.enums))
+ self.check_types()
+
+ def save(self, dirname=None):
+ if dirname is None or dirname == '-':
+ dirname='internal'
+ if not os.path.isdir(dirname):
+ os.mkdir(dirname)
+
+ print "Generating java code in %s/" % dirname
+
+ # Generate enum files
+ self.generate_enums(dirname, self.parser.enums)
+
+ # Generate LibVlc.java code
+ self.generate_libvlc(dirname)
+
+ def output(self, fd, *p):
+ fd.write(" ".join(p))
+ fd.write("\n")
+
+ def check_types(self):
+ """Make sure that all types are properly translated.
+
+ This method must be called *after* convert_enum_names, since
+ the latter populates type2class with converted enum names.
+ """
+ for (rt, met, params, c) in self.parser.methods:
+ if met in blacklist:
+ continue
+ for typ, name in params:
+ if not typ in self.type2class:
+ raise Exception("No conversion for %s (from %s:%s)" % (typ, met, name))
+
+ def convert_enum_names(self, enums):
+ """Convert enum names into Java names.
+ """
+ res={}
+ for (typ, name, values, comment) in enums:
+ if typ != 'enum':
+ raise Exception('This method only handles enums')
+ pyname=re.findall('(libvlc|mediacontrol)_(.+?)(_t)?$', name)[0][1]
+ if '_' in pyname:
+ pyname=pyname.title().replace('_', '')
+ elif not pyname[0].isupper():
+ pyname=pyname.capitalize()
+ res[name]=pyname
+ return res
+
+ def insert_code(self, fd, filename):
+ """Generate header/footer code.
+ """
+ f=open(filename, 'r')
+ for l in f:
+ if l.startswith('build_date'):
+ self.output(fd, 'build_date="%s";' % time.ctime())
+ else:
+ self.output(fd, l.rstrip())
+ f.close()
+
+ def generate_header(self, fd):
+ """Generate LibVlc header.
+ """
+ for (c_type, jna_type) in self.type2class.iteritems():
+ if c_type.endswith('*') and jna_type.startswith('LibVlc'):
+ self.output(fd, ''' public class %s extends PointerType
+ {
+ }
+''' % jna_type)
+
+ def generate_libvlc(self, dirname):
+ """Generate LibVlc.java JNA glue code.
+ """
+ filename=os.path.join(dirname, 'LibVlc.java')
+ fd=open(filename, 'w')
+
+ self.insert_code(fd, 'boilerplate.java')
+ self.insert_code(fd, 'LibVlc-header.java')
+ #wrapped_methods=self.generate_wrappers(self.parser.methods)
+ self.generate_header(fd)
+ for (rtype, method, params, comment) in self.parser.methods: