int i_dialogs; ///< Number of dialogs
interaction_dialog_t **pp_dialogs; ///< Dialogs
intf_thread_t *p_intf; ///< Interface to use
- int i_last_id; ///< Last attributed ID
};
static interaction_t * InteractionGet( vlc_object_t * );
static void InteractionManage( interaction_t * );
static void DialogDestroy( interaction_dialog_t * );
-static int DialogSend( vlc_object_t *, interaction_dialog_t * );
+static int DialogSend( interaction_dialog_t * );
#define DIALOG_INIT( type, err ) \
interaction_dialog_t* p_new = calloc( 1, sizeof( interaction_dialog_t ) ); \
if( !p_new ) return err; \
p_new->p_parent = vlc_object_hold( p_this ); \
p_new->b_cancelled = false; \
- p_new->i_status = NEW_DIALOG; \
+ p_new->i_status = SENT_DIALOG; \
p_new->i_flags = 0; \
p_new->i_type = INTERACT_DIALOG_##type; \
p_new->psz_returned[0] = NULL; \
else
p_new->i_flags = DIALOG_NONBLOCKING_ERROR;
- return DialogSend( p_this, p_new );
+ return DialogSend( p_new );
}
/**
p_new->i_flags = DIALOG_WARNING;
- return DialogSend( p_this, p_new );
+ return DialogSend( p_new );
}
/**
p_new->i_flags = DIALOG_YES_NO_CANCEL;
p_new->psz_default_button = strdup( psz_default );
p_new->psz_alternate_button = strdup( psz_alternate );
- if( psz_other )
- p_new->psz_other_button = strdup( psz_other );
+ p_new->psz_other_button = psz_other ? strdup( psz_other ) : NULL;
- return DialogSend( p_this, p_new );
+ return DialogSend( p_new );
}
/**
else
p_new->i_flags = DIALOG_INTF_PROGRESS;
- DialogSend( p_this, p_new );
+ DialogSend( p_new );
return p_new;
}
p_new->i_flags = DIALOG_LOGIN_PW_OK_CANCEL;
- i_ret = DialogSend( p_this, p_new );
+ i_ret = DialogSend( p_new );
if( i_ret != DIALOG_CANCELLED && i_ret != VLC_EGENERIC )
{
p_new->i_flags = DIALOG_PSZ_INPUT_OK_CANCEL;
- i_ret = DialogSend( p_this, p_new );
+ i_ret = DialogSend( p_new );
if( i_ret != DIALOG_CANCELLED )
{
p_interaction->i_dialogs = 0;
p_interaction->pp_dialogs = NULL;
p_interaction->p_intf = NULL;
- p_interaction->i_last_id = 0;
vlc_cond_init( &p_interaction->wait );
/* Ask for the dialog to be sent to the user. Wait for answer
* if required */
-static int DialogSend( vlc_object_t *p_this, interaction_dialog_t *p_dialog )
+static int DialogSend( interaction_dialog_t *p_dialog )
{
- interaction_t *p_interaction = InteractionGet( p_dialog->p_parent );
+ interaction_t *p_interaction;
+ intf_thread_t *p_intf;
+
+ if( p_dialog->p_parent->i_flags & OBJECT_FLAGS_NOINTERACT )
+ return VLC_EGENERIC;
+ p_interaction = InteractionGet( p_dialog->p_parent );
if( !p_interaction )
return VLC_EGENERIC;
- if( p_this->i_flags & OBJECT_FLAGS_NOINTERACT )
+ p_intf = SearchInterface( p_interaction );
+ if( p_intf == NULL )
{
+ p_dialog->i_return = DIALOG_DEFAULT; /* Give default answer */
+
+ /* Pretend we have hidden and destroyed it */
+ p_dialog->i_status = HIDING_DIALOG;
vlc_object_release( p_interaction );
- return VLC_EGENERIC;
+ return VLC_SUCCESS;
}
+ p_dialog->p_interface = p_intf;
- if( config_GetInt( p_this, "interact" ) ||
+ if( config_GetInt( p_interaction, "interact" ) ||
p_dialog->i_flags & DIALOG_BLOCKING_ERROR ||
p_dialog->i_flags & DIALOG_NONBLOCKING_ERROR )
{
- bool b_found = false;
- int i;
+ vlc_value_t val;
+
p_dialog->p_interaction = p_interaction;
- p_dialog->p_parent = p_this;
+ p_dialog->i_action = INTERACT_NEW;
+ val.p_address = p_dialog;
+ var_Set( p_dialog->p_interface, "interaction", val );
/* Check if we have already added this dialog */
vlc_object_lock( p_interaction );
- for( i = 0 ; i< p_interaction->i_dialogs; i++ )
- {
- if( p_interaction->pp_dialogs[i] == p_dialog )
- b_found = true;
- }
/* Add it to the queue, the main loop will send the orders to the
* interface */
- if( ! b_found )
- {
- INSERT_ELEM( p_interaction->pp_dialogs,
- p_interaction->i_dialogs,
- p_interaction->i_dialogs,
- p_dialog );
- }
- else
- p_dialog->i_status = UPDATED_DIALOG;
+ INSERT_ELEM( p_interaction->pp_dialogs, p_interaction->i_dialogs,
+ p_interaction->i_dialogs, p_dialog );
if( p_dialog->i_type == INTERACT_DIALOG_TWOWAY ) /* Wait for answer */
{
vlc_value_t val;
int i_index;
- /* Nothing to do */
- if( p_interaction->i_dialogs == 0 ) return;
-
- p_interaction->p_intf = SearchInterface( p_interaction );
- if( !p_interaction->p_intf )
- {
- /* We mark all dialogs as answered with their "default" answer */
- for( i_index = 0 ; i_index < p_interaction->i_dialogs; i_index ++ )
- {
- interaction_dialog_t *p_dialog = p_interaction->pp_dialogs[i_index];
- p_dialog->i_return = DIALOG_DEFAULT; /* Give default answer */
-
- /* Pretend we have hidden and destroyed it */
- if( p_dialog->i_status == HIDDEN_DIALOG )
- p_dialog->i_status = DESTROYED_DIALOG;
- else
- p_dialog->i_status = HIDING_DIALOG;
- }
- }
-
for( i_index = 0 ; i_index < p_interaction->i_dialogs; i_index ++ )
{
interaction_dialog_t *p_dialog = p_interaction->pp_dialogs[i_index];
/* Ask interface to hide it */
p_dialog->i_action = INTERACT_HIDE;
val.p_address = p_dialog;
- if( p_interaction->p_intf )
- var_Set( p_interaction->p_intf, "interaction", val );
+ var_Set( p_dialog->p_interface, "interaction", val );
p_dialog->i_status = HIDING_DIALOG;
break;
case UPDATED_DIALOG:
p_dialog->i_action = INTERACT_UPDATE;
val.p_address = p_dialog;
- if( p_interaction->p_intf )
- var_Set( p_interaction->p_intf, "interaction", val );
+ var_Set( p_dialog->p_interface, "interaction", val );
p_dialog->i_status = SENT_DIALOG;
break;
case HIDDEN_DIALOG:
if( !(p_dialog->i_flags & DIALOG_GOT_ANSWER) ) break;
p_dialog->i_action = INTERACT_DESTROY;
val.p_address = p_dialog;
- if( p_interaction->p_intf )
- var_Set( p_interaction->p_intf, "interaction", val );
+ var_Set( p_dialog->p_interface, "interaction", val );
break;
case DESTROYED_DIALOG:
/* Interface has now destroyed it, remove it */
i_index--;
DialogDestroy( p_dialog );
break;
- case NEW_DIALOG:
- /* This is truly a new dialog, send it. */
-
- p_dialog->i_action = INTERACT_NEW;
- val.p_address = p_dialog;
- if( p_interaction->p_intf )
- var_Set( p_interaction->p_intf, "interaction", val );
- p_dialog->i_status = SENT_DIALOG;
- break;
}
}
-
- if( p_interaction->p_intf )
- vlc_object_release( p_interaction->p_intf );
}