/** * Sends an error message through the user interface (if any). * @param obj the VLC object emitting the error * @param modal whether to wait for user to acknowledge the error * before returning control to the caller * @param title title of the error dialog * @param fmt format string for the error message * @param ap parameters list for the formatted error message */ void dialog_VFatal (vlc_object_t *obj, bool modal, const char *title, const char *fmt, va_list ap) { char *text; if (obj->i_flags & OBJECT_FLAGS_NOINTERACT) return; vlc_object_t *provider = dialog_GetProvider (obj); if (provider == NULL) { msg_Err (obj, "%s", title); msg_GenericVa (obj, VLC_MSG_ERR, MODULE_STRING, fmt, ap); return; } if (vasprintf (&text, fmt, ap) != -1) { dialog_fatal_t dialog = { title, text, }; var_SetAddress (provider, modal ? "dialog-critical" : "dialog-error", &dialog); free (text); } vlc_object_release (provider); }
/** * Creates a progress bar dialog. */ dialog_progress_bar_t * dialog_ProgressCreate (vlc_object_t *obj, const char *title, const char *message, const char *cancel) { if (obj->i_flags & OBJECT_FLAGS_NOINTERACT) return NULL; vlc_object_t *provider = dialog_GetProvider (obj); if (provider == NULL) return NULL; dialog_progress_bar_t *dialog = malloc (sizeof (*dialog)); if (dialog != NULL) { dialog->title = title; dialog->message = message; dialog->cancel = cancel; var_SetAddress (provider, "dialog-progress-bar", dialog); #ifndef NDEBUG dialog->title = dialog->message = dialog->cancel = NULL; #endif assert (dialog->pf_update); assert (dialog->pf_check); assert (dialog->pf_destroy); } /* FIXME: This could conceivably crash if the dialog provider is destroyed * before the dialog user. Holding the provider does not help, as it only * protects object variable operations. For instance, it does not prevent * unloading of the interface plugin. In the short term, the only solution * is to not use progress dialog after deinitialization of the interfaces. */ vlc_object_release (provider); return dialog; }
/** * Asks a total (Yes/No/Cancel) question through the user interface. * @param obj VLC object emitting the question * @param title dialog box title * @param fmt format string for the dialog box text * @param yes first choice/button text * @param no second choice/button text * @param cancel third answer/button text, or NULL if no third option * @return 0 if the user could not answer the question (e.g. there is no UI), * 1, 2 resp. 3 if the user pressed the first, second resp. third button. */ int dialog_Question (vlc_object_t *obj, const char *title, const char *fmt, const char *yes, const char *no, const char *cancel, ...) { if (obj->i_flags & OBJECT_FLAGS_NOINTERACT) return 0; vlc_object_t *provider = dialog_GetProvider (obj); if (provider == NULL) return 0; char *text; va_list ap; int answer = 0; va_start (ap, cancel); if (vasprintf (&text, fmt, ap) != -1) { dialog_question_t dialog = { title, text, yes, no, cancel, 0, }; var_SetAddress (provider, "dialog-question", &dialog); answer = dialog.answer; } va_end (ap); vlc_object_release (provider); return answer; }
/** * Requests a username and password through the user interface. * @param obj the VLC object requesting credential information * @param username a pointer to the specified username [OUT] * @param password a pointer to the specified password [OUT] * @param title title for the dialog * @param fmt format string for the message in the dialog * @return Nothing. If a user name resp. a password was specified, * it will be returned as a heap-allocated character array * into the username resp password pointer. Those must be freed with free(). * Otherwise *username resp *password will be NULL. */ void dialog_Login (vlc_object_t *obj, char **username, char **password, const char *title, const char *fmt, ...) { assert ((username != NULL) && (password != NULL)); *username = *password = NULL; if (obj->i_flags & OBJECT_FLAGS_NOINTERACT) return; vlc_object_t *provider = dialog_GetProvider (obj); if (provider == NULL) return; char *text; va_list ap; va_start (ap, fmt); if (vasprintf (&text, fmt, ap) != -1) { dialog_login_t dialog = { title, text, username, password, }; var_SetAddress (provider, "dialog-login", &dialog); free (text); } va_end (ap); vlc_object_release (provider); }
/** * Asks a total (Yes/No/Cancel) question through the user interface. * @param obj VLC object emitting the question * @param title dialog box title * @param text dialog box text * @param yes first choice/button text * @param no second choice/button text * @param cancel third answer/button text, or NULL if no third option * @return 0 if the user could not answer the question (e.g. there is no UI), * 1, 2 resp. 3 if the user pressed the first, second resp. third button. */ int dialog_Question (vlc_object_t *obj, const char *title, const char *text, const char *yes, const char *no, const char *cancel) { if (obj->i_flags & OBJECT_FLAGS_NOINTERACT) return 0; vlc_object_t *provider = dialog_GetProvider (obj); if (provider == NULL) return 0; dialog_question_t dialog = { title, text, yes, no, cancel, 0, }; var_SetAddress (provider, "dialog-question", &dialog); vlc_object_release (provider); return dialog.answer; }
int dialog_ExtensionUpdate (vlc_object_t *obj, extension_dialog_t *dialog) { assert (obj); assert (dialog); vlc_object_t *dp = dialog_GetProvider(obj); if (!dp) { msg_Warn (obj, "Dialog provider is not set, can't update dialog '%s'", dialog->psz_title); return VLC_EGENERIC; } // Signaling the dialog provider int ret = var_SetAddress (dp, "dialog-extension", dialog); vlc_object_release (dp); return ret; }