mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
download: Add DOWNLOAD_EXTERNAL flag
Like in ELinks 0.13.GIT commit b3cfede1c1
made on 2007-11-07, only with more comments and a bit different names.
This commit is contained in:
parent
a2c8dc8c61
commit
db128fecd9
@ -464,7 +464,9 @@ download_data(struct download *download, struct file_download *file_download)
|
|||||||
* Comes directly from the @a data argument of lookup_unique_name().
|
* Comes directly from the @a data argument of lookup_unique_name().
|
||||||
*
|
*
|
||||||
* @param flags
|
* @param flags
|
||||||
* Whether the user chose to resume downloading an existing file.
|
* The same as the @a flags argument of create_download_file(),
|
||||||
|
* except the ::DOWNLOAD_RESUME_SELECTED bit will be changed to match
|
||||||
|
* what the user chose.
|
||||||
*
|
*
|
||||||
* @relates lun_hop */
|
* @relates lun_hop */
|
||||||
typedef void lun_callback_T(struct terminal *term, unsigned char *file,
|
typedef void lun_callback_T(struct terminal *term, unsigned char *file,
|
||||||
@ -496,10 +498,13 @@ struct lun_hop {
|
|||||||
/** A pointer to be passed to #callback. */
|
/** A pointer to be passed to #callback. */
|
||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
/** Whether the download can be resumed.
|
/** Saved flags to be passed to #callback.
|
||||||
* The ::DOWNLOAD_RESUME_SELECTED bit should be clear
|
* If the user chooses to resume, then lun_resume() sets
|
||||||
* because otherwise there would have been no reason to
|
* ::DOWNLOAD_RESUME_SELECTED when it calls #callback.
|
||||||
* ask the user and initialize this structure. */
|
*
|
||||||
|
* @invariant The ::DOWNLOAD_RESUME_SELECTED bit should be
|
||||||
|
* clear here because otherwise there would have been no
|
||||||
|
* reason to ask the user and initialize this structure. */
|
||||||
enum download_flags flags;
|
enum download_flags flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -543,11 +548,6 @@ struct cdf_hop {
|
|||||||
* #callback does not care about the name. */
|
* #callback does not care about the name. */
|
||||||
unsigned char **real_file;
|
unsigned char **real_file;
|
||||||
|
|
||||||
/** If nonzero, give only the user herself access to the file
|
|
||||||
* (even if the umask is looser), and create the file with
|
|
||||||
* @c O_EXCL unless resuming. */
|
|
||||||
int safe;
|
|
||||||
|
|
||||||
/** This function will be called when the file has been opened,
|
/** This function will be called when the file has been opened,
|
||||||
* or when it is known that the file will not be opened. */
|
* or when it is known that the file will not be opened. */
|
||||||
cdf_callback_T *callback;
|
cdf_callback_T *callback;
|
||||||
@ -643,9 +643,13 @@ lun_resume(void *lun_hop_)
|
|||||||
* lookup_unique_name() treats this original string as read-only.
|
* lookup_unique_name() treats this original string as read-only.
|
||||||
*
|
*
|
||||||
* @param[in] flags
|
* @param[in] flags
|
||||||
* Indicates if the user already chose to resume downloading,
|
* Flags controlling how to download the file.
|
||||||
* before ELinks even asked for the file name.
|
* ::DOWNLOAD_RESUME_ALLOWED adds a "Resume" button to the dialog.
|
||||||
* See ::ACT_MAIN_LINK_DOWNLOAD_RESUME.
|
* ::DOWNLOAD_RESUME_SELECTED means the user already chose to resume
|
||||||
|
* downloading (with ::ACT_MAIN_LINK_DOWNLOAD_RESUME), before ELinks
|
||||||
|
* even asked for the file name; thus don't ask whether to overwrite.
|
||||||
|
* Other flags, such as ::DOWNLOAD_EXTERNAL, have no effect at this
|
||||||
|
* level but they get passed to @a callback.
|
||||||
*
|
*
|
||||||
* @param callback
|
* @param callback
|
||||||
* Will be called when the user answers, or right away if the question
|
* Will be called when the user answers, or right away if the question
|
||||||
@ -765,7 +769,7 @@ create_download_file_do(struct terminal *term, unsigned char *file,
|
|||||||
#ifdef NO_FILE_SECURITY
|
#ifdef NO_FILE_SECURITY
|
||||||
int sf = 0;
|
int sf = 0;
|
||||||
#else
|
#else
|
||||||
int sf = cdf_hop->safe;
|
int sf = !!(flags & DOWNLOAD_EXTERNAL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!file) goto finish;
|
if (!file) goto finish;
|
||||||
@ -802,7 +806,7 @@ create_download_file_do(struct terminal *term, unsigned char *file,
|
|||||||
} else {
|
} else {
|
||||||
set_bin(h);
|
set_bin(h);
|
||||||
|
|
||||||
if (!cdf_hop->safe) {
|
if (!(flags & DOWNLOAD_EXTERNAL)) {
|
||||||
unsigned char *download_dir = get_opt_str("document.download.directory");
|
unsigned char *download_dir = get_opt_str("document.download.directory");
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -843,14 +847,14 @@ finish:
|
|||||||
* file that was eventually opened. @a callback must then arrange for
|
* file that was eventually opened. @a callback must then arrange for
|
||||||
* this string to be freed with mem_free().
|
* this string to be freed with mem_free().
|
||||||
*
|
*
|
||||||
* @param safe
|
|
||||||
* If nonzero, give only the user herself access to the file (even if
|
|
||||||
* the umask is looser), and create the file with @c O_EXCL unless
|
|
||||||
* resuming.
|
|
||||||
*
|
|
||||||
* @param flags
|
* @param flags
|
||||||
* Whether the download can be resumed, and whether the user already
|
* Flags controlling how to download the file.
|
||||||
* asked for it to be resumed.
|
* ::DOWNLOAD_RESUME_ALLOWED adds a "Resume" button to the dialog.
|
||||||
|
* ::DOWNLOAD_RESUME_SELECTED skips the dialog entirely.
|
||||||
|
* ::DOWNLOAD_EXTERNAL causes the file to be created with settings
|
||||||
|
* suitable for a temporary file: give only the user herself access to
|
||||||
|
* the file (even if the umask is looser), and create the file with
|
||||||
|
* @c O_EXCL unless resuming.
|
||||||
*
|
*
|
||||||
* @param callback
|
* @param callback
|
||||||
* This function will be called when the file has been opened,
|
* This function will be called when the file has been opened,
|
||||||
@ -862,7 +866,7 @@ finish:
|
|||||||
* @relates cdf_hop */
|
* @relates cdf_hop */
|
||||||
void
|
void
|
||||||
create_download_file(struct terminal *term, unsigned char *fi,
|
create_download_file(struct terminal *term, unsigned char *fi,
|
||||||
unsigned char **real_file, int safe,
|
unsigned char **real_file,
|
||||||
enum download_flags flags,
|
enum download_flags flags,
|
||||||
cdf_callback_T *callback, void *data)
|
cdf_callback_T *callback, void *data)
|
||||||
{
|
{
|
||||||
@ -875,7 +879,6 @@ create_download_file(struct terminal *term, unsigned char *fi,
|
|||||||
}
|
}
|
||||||
|
|
||||||
cdf_hop->real_file = real_file;
|
cdf_hop->real_file = real_file;
|
||||||
cdf_hop->safe = safe;
|
|
||||||
cdf_hop->callback = callback;
|
cdf_hop->callback = callback;
|
||||||
cdf_hop->data = data;
|
cdf_hop->data = data;
|
||||||
|
|
||||||
@ -1040,7 +1043,7 @@ common_download(struct session *ses, unsigned char *file,
|
|||||||
|
|
||||||
kill_downloads_to_file(file);
|
kill_downloads_to_file(file);
|
||||||
|
|
||||||
create_download_file(ses->tab->term, file, &cmdw_hop->real_file, 0,
|
create_download_file(ses->tab->term, file, &cmdw_hop->real_file,
|
||||||
flags, common_download_do, cmdw_hop);
|
flags, common_download_do, cmdw_hop);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1202,8 +1205,9 @@ continue_download(void *data, unsigned char *file)
|
|||||||
|
|
||||||
create_download_file(type_query->ses->tab->term, file,
|
create_download_file(type_query->ses->tab->term, file,
|
||||||
&codw_hop->real_file,
|
&codw_hop->real_file,
|
||||||
!!type_query->external_handler,
|
type_query->external_handler
|
||||||
DOWNLOAD_RESUME_ALLOWED,
|
? DOWNLOAD_RESUME_ALLOWED | DOWNLOAD_EXTERNAL
|
||||||
|
: DOWNLOAD_RESUME_ALLOWED,
|
||||||
continue_download_do, codw_hop);
|
continue_download_do, codw_hop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ struct download;
|
|||||||
|
|
||||||
typedef void (download_callback_T)(struct download *, void *);
|
typedef void (download_callback_T)(struct download *, void *);
|
||||||
|
|
||||||
/** Whether to resume downloading to a file. This is a bit mask.
|
/** Flags controlling how to download a file. This is a bit mask.
|
||||||
* Unrecognized bits should be preserved and ignored. */
|
* Unrecognized bits should be preserved and ignored. */
|
||||||
enum download_flags {
|
enum download_flags {
|
||||||
/** Downloading cannot be resumed; do not offer such an option
|
/** Downloading cannot be resumed; do not offer such an option
|
||||||
@ -31,8 +31,11 @@ enum download_flags {
|
|||||||
DOWNLOAD_RESUME_ALLOWED = 1,
|
DOWNLOAD_RESUME_ALLOWED = 1,
|
||||||
|
|
||||||
/** The user wants to resume downloading. This must not occur
|
/** The user wants to resume downloading. This must not occur
|
||||||
* without DOWNLOAD_RESUME_ALLOWED. */
|
* without #DOWNLOAD_RESUME_ALLOWED. */
|
||||||
DOWNLOAD_RESUME_SELECTED = 2
|
DOWNLOAD_RESUME_SELECTED = 2,
|
||||||
|
|
||||||
|
/** The file will be opened in an external handler. */
|
||||||
|
DOWNLOAD_EXTERNAL = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
struct download {
|
struct download {
|
||||||
@ -188,7 +191,7 @@ typedef void cdf_callback_T(struct terminal *term, int fd,
|
|||||||
void start_download(void *, unsigned char *);
|
void start_download(void *, unsigned char *);
|
||||||
void resume_download(void *, unsigned char *);
|
void resume_download(void *, unsigned char *);
|
||||||
void create_download_file(struct terminal *, unsigned char *, unsigned char **,
|
void create_download_file(struct terminal *, unsigned char *, unsigned char **,
|
||||||
int, enum download_flags, cdf_callback_T *, void *);
|
enum download_flags, cdf_callback_T *, void *);
|
||||||
|
|
||||||
void abort_all_downloads(void);
|
void abort_all_downloads(void);
|
||||||
void destroy_downloads(struct session *);
|
void destroy_downloads(struct session *);
|
||||||
|
@ -1646,7 +1646,7 @@ save_formatted(void *data, unsigned char *file)
|
|||||||
assert(doc_view && doc_view->document);
|
assert(doc_view && doc_view->document);
|
||||||
if_assert_failed return;
|
if_assert_failed return;
|
||||||
|
|
||||||
create_download_file(ses->tab->term, file, NULL, 0,
|
create_download_file(ses->tab->term, file, NULL,
|
||||||
DOWNLOAD_RESUME_DISABLED,
|
DOWNLOAD_RESUME_DISABLED,
|
||||||
save_formatted_finish, doc_view->document);
|
save_formatted_finish, doc_view->document);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user