Commit 72f3bf6b authored by Filippo Carone's avatar Filippo Carone

audio / video libvlc functions binded.

parent fcd621cc
/***************************************************************************** /*****************************************************************************
* JVLC.java: Main Java Class, represents a libvlc_instance_t object * JVLC.java: Main Java Class, represents a libvlc_instance_t object
***************************************************************************** *****************************************************************************
*
* Copyright (C) 1998-2006 the VideoLAN team * Copyright (C) 1998-2006 the VideoLAN team
*
* Author: Filippo Carone <filippo@carone.org>
*
* Created on 28-feb-2006
* *
* $Id$ * $Id$
* *
* Authors: Filippo Carone <filippo@carone.org> * This program is free software; you can redistribute it
* * and/or modify it under the terms of the GNU General Public License
* This program is free software; you can redistribute it and/or modify * as published by the Free Software Foundation; either version 2 of the
* it under the terms of the GNU General Public License as published by * License, or (at your option) any later version.
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * This program is distributed in the hope that it will be useful, but
* * WITHOUT ANY WARRANTY; without even the implied warranty of
* This program is distributed in the hope that it will be useful, * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* but WITHOUT ANY WARRANTY; without even the implied warranty of * General Public License for more details.
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. * You should have received a copy of the GNU General Public
* * License along with this program; if not, write to the Free Software
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/ *
*/
/**
* @author Filippo Carone <filippo@carone.org>
*/
package org.videolan.jvlc; package org.videolan.jvlc;
public class JVLC implements JLibVLC { public class JVLC implements JLibVLC {
static { static {
System.load(System.getProperty("user.dir") + "/libjvlc.so"); System.load(System.getProperty( "user.dir" ) + "/libjvlc.so" );
} }
...@@ -36,50 +43,72 @@ public class JVLC implements JLibVLC { ...@@ -36,50 +43,72 @@ public class JVLC implements JLibVLC {
public JVLC() { public JVLC() {
_instance = createInstance(); _instance = createInstance();
playlist = new Playlist(_instance); playlist = new Playlist( _instance );
} }
public JVLC(String[] args) { public JVLC(String[] args) {
_instance = createInstance(args); _instance = createInstance( args );
playlist = new Playlist(_instance); playlist = new Playlist( _instance );
} }
/*
* Core methods
*/
private native long createInstance(); private native long createInstance();
private native long createInstance(String[] args); private native long createInstance( String[] args );
/*
* Audio native methods
*/
private native boolean _getMute();
private native void _setMute( boolean value );
private native void _toggleMute();
private native int _getVolume();
private native void _setVolume( int volume );
public void getMute() { /*
* Video native methods
*/
private native void _toggleFullscreen();
private native void _setFullscreen( boolean value);
private native boolean _getFullscreen();
public boolean getMute() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return _getMute();
} }
public void setMute() { public void setMute(boolean value) {
// TODO Auto-generated method stub _setMute( value );
} }
public void toggleMute() {
_toggleMute();
}
public void getVolume() { public int getVolume() {
// TODO Auto-generated method stub return _getVolume();
} }
public void setVolume() { public void setVolume(int volume) {
// TODO Auto-generated method stub _setVolume( volume );
} }
public void toggleFullscreen() { public void toggleFullscreen() {
// TODO Auto-generated method stub _toggleFullscreen();
} }
public void setFullscreen() { public void setFullscreen( boolean value ) {
// TODO Auto-generated method stub _setFullscreen( value );
} }
public void getFullscreen() { public boolean getFullscreen() {
// TODO Auto-generated method stub return _getFullscreen();
} }
public void getLength() { public void getLength() {
...@@ -111,4 +140,11 @@ public class JVLC implements JLibVLC { ...@@ -111,4 +140,11 @@ public class JVLC implements JLibVLC {
return _instance; return _instance;
} }
/*
* Getters and setters
*/
public Playlist getPlaylist() {
return playlist;
}
} }
/***************************************************************************** /*****************************************************************************
* JVLC.java: JNI interface for vlc Java Bindings * JVLC.java: JNI interface for vlc Java Bindings
***************************************************************************** *****************************************************************************
* Copyright (C) 1998-2005 the VideoLAN team * Copyright (C) 1998-2006 the VideoLAN team
*
* $Id$
* *
* Authors: Filippo Carone <filippo@carone.org> * Authors: Filippo Carone <filippo@carone.org>
* *
* $Id$
*
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
...@@ -40,186 +40,419 @@ jlong getPlaylistInstance (JNIEnv *env, jobject _this); ...@@ -40,186 +40,419 @@ jlong getPlaylistInstance (JNIEnv *env, jobject _this);
JNIEXPORT jlong JNICALL Java_org_videolan_jvlc_JVLC_createInstance__ (JNIEnv *env, jobject _this) { JNIEXPORT jlong JNICALL Java_org_videolan_jvlc_JVLC_createInstance__ (JNIEnv *env, jobject _this) {
long res; // res is the pointer to libvlc_instance_t
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t )); long res;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception ); libvlc_exception_init( exception );
res = ( long ) libvlc_new( 0, NULL, exception ); res = ( long ) libvlc_new( 0, NULL, exception );
free( exception ); if ( libvlc_exception_raised( exception ))
{
///\TODO: raise java exception
printf("%s\n", libvlc_exception_get_message( exception ));
}
return res; free( exception );
return res;
} }
JNIEXPORT jlong JNICALL Java_org_videolan_jvlc_JVLC_createInstance___3Ljava_lang_String_2 (JNIEnv *env, jobject _this, jobjectArray args) { JNIEXPORT jlong JNICALL Java_org_videolan_jvlc_JVLC_createInstance___3Ljava_lang_String_2 (JNIEnv *env, jobject _this, jobjectArray args) {
long res; long res;
int argc; int argc;
const char **argv; const char **argv;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ) ); libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ) );
libvlc_exception_init( exception ); libvlc_exception_init( exception );
argc = (int) env->GetArrayLength((jarray) args); argc = (int) env->GetArrayLength((jarray) args);
argv = (const char **) malloc(argc * sizeof(char*)); argv = (const char **) malloc(argc * sizeof(char*));
for (int i = 0; i < argc; i++) { for (int i = 0; i < argc; i++) {
argv[i] = env->GetStringUTFChars((jstring) env->GetObjectArrayElement(args, i), argv[i] = env->GetStringUTFChars((jstring) env->GetObjectArrayElement(args, i),
0 0
); );
} }
res = (long) libvlc_new(argc, (char**) argv, exception );
free( exception );
free( argv );
return res;
}
res = (long) libvlc_new(argc, (char**) argv, exception ); /*
* Audio native functions
*/
JNIEXPORT jboolean JNICALL Java_org_videolan_jvlc_JVLC__1getMute (JNIEnv *env, jobject _this)
{
// res is the final result
jboolean res;
long instance = 0;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this );
res = (jboolean) libvlc_audio_get_mute( ( libvlc_instance_t * ) instance, exception );
if ( libvlc_exception_raised( exception ))
{
///\TODO: raise java exception
printf("%s\n", libvlc_exception_get_message( exception ));
}
free( exception );
return res;
}
JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLC__1setMute (JNIEnv *env, jobject _this, jboolean value)
{
long instance = 0;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
free( exception ); libvlc_exception_init( exception );
free( argv );
return res; instance = getPlaylistInstance( env, _this );
libvlc_audio_set_mute( ( libvlc_instance_t * ) instance, value, exception );
if ( libvlc_exception_raised( exception ))
{
///\TODO: raise java exception
printf("%s\n", libvlc_exception_get_message( exception ));
}
free( exception );
} }
JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLC__1toggleMute (JNIEnv *env, jobject _this)
{
long instance = 0;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this );
///\TODO: NO, this is not what we want.
libvlc_audio_get_mute( ( libvlc_instance_t * ) instance, exception );
if ( libvlc_exception_raised( exception ))
{
///\TODO: raise java exception
printf("%s\n", libvlc_exception_get_message( exception ));
}
free( exception );
}
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC__1getVolume (JNIEnv *env, jobject _this)
{
// res is the final result
jboolean res;
long instance = 0;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this );
res = (jboolean) libvlc_audio_get_mute( ( libvlc_instance_t * ) instance, exception );
if ( libvlc_exception_raised( exception ))
{
///\TODO: raise java exception
printf("%s\n", libvlc_exception_get_message( exception ));
}
free( exception );
return res;
}
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_JVLC__1getVolume (JNIEnv *env, jobject _this, jboolean value)
{
jint res = 0;
long instance = 0;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this );
res = libvlc_audio_get_volume( ( libvlc_instance_t * ) instance, exception );
if ( libvlc_exception_raised( exception ))
{
///\TODO: raise java exception
printf("%s\n", libvlc_exception_get_message( exception ));
}
free( exception );
return res;
}
JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLC__1setVolume (JNIEnv *env, jobject _this, jint volume)
{
long instance = 0;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this );
libvlc_audio_set_volume( ( libvlc_instance_t * ) instance, volume, exception );
if ( libvlc_exception_raised( exception ))
{
///\TODO: raise java exception
printf("%s\n", libvlc_exception_get_message( exception ));
}
free( exception );
}
/*
* Video native functions
*/
JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLC__1toggleFullscreen (JNIEnv *env, jobject _this)
{
long instance = 0;
libvlc_input_t *input;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this );
input = libvlc_playlist_get_input( ( libvlc_instance_t *) instance, exception );
libvlc_toggle_fullscreen( input, exception );
if ( libvlc_exception_raised( exception ))
{
///\TODO: raise java exception
printf("%s\n", libvlc_exception_get_message( exception ));
}
free( exception );
}
JNIEXPORT void JNICALL Java_org_videolan_jvlc_JVLC__1setFullscreen (JNIEnv *env, jobject _this, jboolean value)
{
long instance = 0;
libvlc_input_t *input;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this );
input = libvlc_playlist_get_input( ( libvlc_instance_t *) instance, exception );
libvlc_set_fullscreen( input, value, exception );
if ( libvlc_exception_raised( exception ))
{
///\TODO: raise java exception
printf("%s\n", libvlc_exception_get_message( exception ));
}
free( exception );
}
JNIEXPORT jboolean JNICALL Java_org_videolan_jvlc_JVLC__1getFullscreen (JNIEnv *env, jobject _this)
{
int res = 0;
libvlc_input_t *input;
long instance = 0;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this );
input = libvlc_playlist_get_input( ( libvlc_instance_t *) instance, exception );
res = libvlc_get_fullscreen( input, exception );
if ( libvlc_exception_raised( exception ))
{
///\TODO: raise java exception
printf("%s\n", libvlc_exception_get_message( exception ));
}
free( exception );
return res;
}
/* /*
* Playlist native functions * Playlist native functions
*/ */
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1playlist_1add (JNIEnv *env, jobject _this, jstring uri, jstring name) { JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1playlist_1add (JNIEnv *env, jobject _this, jstring uri, jstring name) {
long instance = 0; long instance = 0;
int res = 0; int res = 0;
const char* psz_uri = env->GetStringUTFChars( uri, 0 ); const char* psz_uri = env->GetStringUTFChars( uri, 0 );
const char* psz_name = env->GetStringUTFChars( name, 0 ); const char* psz_name = env->GetStringUTFChars( name, 0 );
libvlc_exception_t *exception = (libvlc_exception_t *) malloc( sizeof( libvlc_exception_t )); libvlc_exception_t *exception = (libvlc_exception_t *) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception ); libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this ); instance = getPlaylistInstance( env, _this );
res = libvlc_playlist_add( (libvlc_instance_t*) instance, psz_uri, psz_name, exception ); res = libvlc_playlist_add( (libvlc_instance_t*) instance, psz_uri, psz_name, exception );
/// \todo check exceptions /// \todo check exceptions
/* free resources */ /* free resources */
free(exception); free(exception);
if (psz_uri != NULL) { if (psz_uri != NULL) {
env->ReleaseStringUTFChars( uri, psz_uri ); env->ReleaseStringUTFChars( uri, psz_uri );
} }
if (psz_name != NULL) { if (psz_name != NULL) {
env->ReleaseStringUTFChars( name, psz_name ); env->ReleaseStringUTFChars( name, psz_name );
} }
return res; return res;
} }
JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1play (JNIEnv *env, jobject _this, jint id, jobjectArray options) { JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1play (JNIEnv *env, jobject _this, jint id, jobjectArray options) {
long instance = 0; long instance = 0;
int i_options = 0; int i_options = 0;
char** ppsz_options = NULL; char** ppsz_options = NULL;
instance = getPlaylistInstance( env, _this ); instance = getPlaylistInstance( env, _this );
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t )); libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception ); libvlc_exception_init( exception );
if ( options != NULL ) ; if ( options != NULL ) ;
/// \TODO: parse options /// \TODO: parse options
libvlc_playlist_play( ( libvlc_instance_t* ) instance, id, i_options, ppsz_options, exception ); libvlc_playlist_play( ( libvlc_instance_t* ) instance, id, i_options, ppsz_options, exception );
free( exception ); free( exception );
return; return;
} }
JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1pause (JNIEnv *env, jobject _this) { JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1pause (JNIEnv *env, jobject _this) {
long instance = 0; long instance = 0;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ) ); libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ) );
libvlc_exception_init( exception ); libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this ); instance = getPlaylistInstance( env, _this );
libvlc_playlist_pause( ( libvlc_instance_t* ) instance, exception ); libvlc_playlist_pause( ( libvlc_instance_t* ) instance, exception );
free( exception ); free( exception );
return; return;
} }
JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1stop (JNIEnv *env, jobject _this) { JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1stop (JNIEnv *env, jobject _this) {
long instance = 0; long instance = 0;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ) ); libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ) );
libvlc_exception_init( exception ); libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this ); instance = getPlaylistInstance( env, _this );
libvlc_playlist_stop( ( libvlc_instance_t* ) instance, exception ); libvlc_playlist_stop( ( libvlc_instance_t* ) instance, exception );
free( exception ); free( exception );
return; return;
} }
JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1next (JNIEnv *env, jobject _this) { JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1next (JNIEnv *env, jobject _this) {
long instance = 0; long instance = 0;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ) ); libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ) );
libvlc_exception_init( exception ); libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this ); instance = getPlaylistInstance( env, _this );
libvlc_playlist_next( ( libvlc_instance_t* ) instance, exception ); libvlc_playlist_next( ( libvlc_instance_t* ) instance, exception );
free( exception ); free( exception );
return; return;
} }
JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1prev (JNIEnv *env, jobject _this) { JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1prev (JNIEnv *env, jobject _this) {
long instance = 0; long instance = 0;
libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t )); libvlc_exception_t *exception = ( libvlc_exception_t * ) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception ); libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this ); instance = getPlaylistInstance( env, _this );
libvlc_playlist_prev( (libvlc_instance_t*) instance, exception ); libvlc_playlist_prev( (libvlc_instance_t*) instance, exception );
free( exception ); free( exception );
return; return;
} }
JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1clear (JNIEnv *env, jobject _this) { JNIEXPORT void JNICALL Java_org_videolan_jvlc_Playlist__1clear (JNIEnv *env, jobject _this) {
long instance = 0; long instance = 0;
libvlc_exception_t *exception = (libvlc_exception_t *) malloc( sizeof( libvlc_exception_t )); libvlc_exception_t *exception = (libvlc_exception_t *) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception ); libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this ); instance = getPlaylistInstance( env, _this );
libvlc_playlist_clear( (libvlc_instance_t*) instance, exception ); libvlc_playlist_clear( (libvlc_instance_t*) instance, exception );
free( exception ); free( exception );
return; return;
} }
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1itemsCount (JNIEnv *env, jobject _this) { JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1itemsCount (JNIEnv *env, jobject _this) {
long instance = 0; long instance = 0;
int res = 0; int res = 0;
libvlc_exception_t *exception = (libvlc_exception_t *) malloc( sizeof( libvlc_exception_t )); libvlc_exception_t *exception = (libvlc_exception_t *) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception ); libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this ); instance = getPlaylistInstance( env, _this );
res = libvlc_playlist_items_count( (libvlc_instance_t*) instance, exception ); res = libvlc_playlist_items_count( (libvlc_instance_t*) instance, exception );
free( exception ); free( exception );
return res; return res;
} }
JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1isPlaying (JNIEnv *env, jobject _this) { JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1isPlaying (JNIEnv *env, jobject _this) {
long instance = 0; long instance = 0;
int res = 0; int res = 0;
libvlc_exception_t *exception = (libvlc_exception_t *) malloc( sizeof( libvlc_exception_t )); libvlc_exception_t *exception = (libvlc_exception_t *) malloc( sizeof( libvlc_exception_t ));
libvlc_exception_init( exception ); libvlc_exception_init( exception );
instance = getPlaylistInstance( env, _this ); instance = getPlaylistInstance( env, _this );
res = libvlc_playlist_isplaying( (libvlc_instance_t*) instance, exception ); res = libvlc_playlist_isplaying( (libvlc_instance_t*) instance, exception );
free( exception ); free( exception );
return res; return res;
} }
...@@ -228,17 +461,17 @@ JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1isPlaying (JNIEnv *env, ...@@ -228,17 +461,17 @@ JNIEXPORT jint JNICALL Java_org_videolan_jvlc_Playlist__1isPlaying (JNIEnv *env,
* Utility functions * Utility functions
*/ */
jlong getClassInstance (JNIEnv *env, jobject _this) { jlong getClassInstance (JNIEnv *env, jobject _this) {
/* get the id field of object */ /* get the id field of object */
jclass cls = env->GetObjectClass(_this); jclass cls = env->GetObjectClass(_this);
jmethodID mid = env->GetMethodID(cls, "getInstance", "()J"); jmethodID mid = env->GetMethodID(cls, "getInstance", "()J");
jlong field = env->CallLongMethod(_this, mid); jlong field = env->CallLongMethod(_this, mid);
return field; return field;
} }
jlong getPlaylistInstance (JNIEnv *env, jobject _this) { jlong getPlaylistInstance (JNIEnv *env, jobject _this) {
/* get the instance field of object */ /* get the instance field of object */
jclass cls = env->GetObjectClass(_this); jclass cls = env->GetObjectClass(_this);
jmethodID mid = env->GetMethodID(cls, "getInstance", "()J"); jmethodID mid = env->GetMethodID(cls, "getInstance", "()J");
jlong field = env->CallLongMethod(_this, mid); jlong field = env->CallLongMethod(_this, mid);
return field; return field;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment