+
+#define LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( attr, returnType, getType, ret, code )\
+returnType libvlc_vlm_get_media_## attr( libvlc_instance_t *p_instance, \
+ char *psz_name, int i_instance, libvlc_exception_t *p_exception ) \
+{ \
+ vlm_media_instance_t *p_mi = libvlc_vlm_get_media_instance( p_instance, psz_name, i_instance, \
+ p_exception ); \
+ if( p_mi ) { \
+ returnType ret_value; \
+ code; \
+ vlm_media_instance_Delete( p_mi ); \
+ return ret_value; \
+ } \
+ libvlc_exception_raise( p_exception, "Unable to get %s "#attr "attribute" ); \
+ return ret; \
+}
+
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( position, float, Float, -1, ret_value = p_mi->d_position; );
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( time, int, Integer, -1, ret_value = p_mi->i_time );
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( length, int, Integer, -1, ret_value = p_mi->i_length );
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( rate, int, Integer, -1, ret_value = p_mi->i_rate );
+/* FIXME extend vlm_media_instance_t to be able to implement them */
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( title, int, Integer, 0, ret_value = 0 );
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( chapter, int, Integer, 0, ret_value = 0 );
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( seekable, int, Bool, 0, ret_value = VLC_FALSE );
+
+#undef LIBVLC_VLM_GET_MEDIA_ATTRIBUTE
+
+char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, char *psz_name,
+ libvlc_exception_t *p_exception )
+{
+ /* FIXME is it needed ? */
+ libvlc_exception_raise( p_exception, "Unable to call show %s", psz_name );
+ return NULL;
+}
+