/*****************************************************************************
* interaction.c: User interaction functions
*****************************************************************************
- * Copyright (C) 2005-2006 VideoLAN
+ * Copyright (C) 2005-2006 the VideoLAN team
* $Id$
*
* Authors: Clément Stenac <zorglub@videolan.org>
/*****************************************************************************
* Preamble
*****************************************************************************/
+
+#include <vlc/vlc.h>
+
#include <stdlib.h> /* free(), strtol() */
#include <stdio.h> /* FILE */
#include <string.h> /* strerror() */
-#include <vlc/vlc.h>
#include <vlc/input.h>
#include <assert.h>
{
va_list args;
DIALOG_INIT( ONEWAY );
-
+
p_new->psz_title = strdup( psz_title );
FORMAT_DESC
p_new->psz_description = strdup( psz_status );
p_new->val.f_float = f_pos;
p_new->i_timeToGo = i_time;
+ p_new->psz_alternate_button = strdup( _("Cancel" ) );
if( psz_title )
{
p_new->i_type = INTERACT_DIALOG_TWOWAY;
p_new->psz_title = strdup( psz_title );
p_new->psz_description = strdup( psz_description );
+ p_new->psz_default_button = strdup( _("Ok" ) );
+ p_new->psz_alternate_button = strdup( _("Cancel" ) );
p_new->i_flags = DIALOG_LOGIN_PW_OK_CANCEL;
i_ret = DialogSend( p_this, p_new );
- if( i_ret != DIALOG_CANCELLED )
+ if( i_ret != DIALOG_CANCELLED && i_ret != VLC_EGENERIC )
{
- assert( p_new->psz_returned[0] && p_new->psz_returned[1] );
- *ppsz_login = strdup( p_new->psz_returned[0] );
- *ppsz_password = strdup( p_new->psz_returned[1] );
+ *ppsz_login = p_new->psz_returned[0]?
+ strdup( p_new->psz_returned[0] ) : NULL;
+ *ppsz_password = p_new->psz_returned[1]?
+ strdup( p_new->psz_returned[1] ) : NULL;
}
return i_ret;
}
/* Get the interaction object. Create it if needed */
static interaction_t * InteractionGet( vlc_object_t *p_this )
{
- playlist_t *p_playlist;
interaction_t *p_interaction;
+ playlist_t *p_playlist = pl_Yield( p_this );
- p_playlist = (playlist_t*) vlc_object_find( p_this, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( !p_playlist )
- return NULL;
-
+ PL_LOCK;
if( p_playlist->p_interaction == NULL )
InteractionInit( p_playlist );
p_interaction = p_playlist->p_interaction;
+ PL_UNLOCK;
- vlc_object_release( p_playlist );
+ pl_Release( p_this );
return p_interaction;
}
if( p_this->i_flags & OBJECT_FLAGS_NOINTERACT ) return VLC_EGENERIC;
- if( config_GetInt(p_this, "interact") ||
+ if( config_GetInt(p_this, "interact") ||
p_dialog->i_flags & DIALOG_BLOCKING_ERROR ||
p_dialog->i_flags & DIALOG_NONBLOCKING_ERROR )
{
}
else
p_dialog->i_status = UPDATED_DIALOG;
- vlc_mutex_unlock( &p_interaction->object_lock );
if( p_dialog->i_type == INTERACT_DIALOG_TWOWAY ) // Wait for answer
{
p_dialog->i_status != HIDDEN_DIALOG &&
!p_dialog->p_parent->b_die )
{
+ vlc_mutex_unlock( &p_interaction->object_lock );
msleep( 100000 );
+ vlc_mutex_lock( &p_interaction->object_lock );
}
- /// \todo locking ?
if( p_dialog->p_parent->b_die )
{
p_dialog->i_return = DIALOG_CANCELLED;
p_dialog->i_status = ANSWERED_DIALOG;
}
p_dialog->i_flags |= DIALOG_GOT_ANSWER;
+ vlc_mutex_unlock( &p_interaction->object_lock );
return p_dialog->i_return;
}
else
}
else
return VLC_EGENERIC;
-}
+}