⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 session.c

📁 ELinks is an advanced and well-established feature-rich text mode web (HTTP/FTP/..) browser. ELinks
💻 C
📖 第 1 页 / 共 5 页
字号:
				/*nfdc->f_data = init_formatted(&fd->f_data->opt);*/				nfdc->f_data = init_formatted(o);				nfdc->f_data->frame_desc = copy_frameset_desc(frm->subframe);				nfdc->f_data->frame_desc_link = 1;			} else {				if (fd->depth < HTML_MAX_FRAME_DEPTH && loc->url && *loc->url)					request_object(fd->ses->term, loc->url, fd->loc->url, PRI_FRAME, NC_CACHE, (void (*)(struct object_request *, void *))fd_loaded, nfdc, &nfdc->rq);			}			xp += frm->xw + gf_val(1, 0);			frm++;			if (!c_loc) loc = loc->next;		}		yp += (frm - 1)->yw + gf_val(1, 0);	}}void html_interpret(struct f_data_c *fd){	int i;	int oxw; int oyw; int oxp; int oyp;	struct f_data_c *sf;	int cch;	/*int first = !fd->f_data;*/	struct document_options o;	struct js_event_spec *doc_js;	struct js_event_spec **link_js;	int nlink_js;	if (!fd->loc) goto d;	if (fd->f_data) {		oxw = fd->f_data->opt.xw;		oyw = fd->f_data->opt.yw;		oxp = fd->f_data->opt.xp;		oyp = fd->f_data->opt.yp;	} else {		oxw = oyw = oxp = oyp = -1;	}	memset(&o, 0, sizeof(struct document_options));	ds2do(&fd->ses->ds, &o);#ifdef JS	o.js_enable = js_enable;#else	o.js_enable=0;#endif#ifdef G	o.aspect_on=aspect_on;	o.bfu_aspect=bfu_aspect;#else	o.aspect_on=0;	o.bfu_aspect=0;#endif	o.plain = fd->vs->plain;	o.xp = fd->xp;	o.yp = fd->yp;	o.xw = fd->xw;	o.yw = fd->yw;	o.scrolling = fd->scrolling;	if (fd->ses->term->spec) {		o.col = fd->ses->term->spec->col;		o.cp = fd->ses->term->spec->charset;		o.braille = fd->ses->term->spec->braille;	} else {		o.col = 3;		o.cp = 0;		o.braille = 0;	}	if (!F) {		memcpy(&o.default_fg, &default_fg, sizeof(struct rgb));		memcpy(&o.default_bg, &default_bg, sizeof(struct rgb));		memcpy(&o.default_link, &default_link, sizeof(struct rgb));		memcpy(&o.default_vlink, &default_vlink, sizeof(struct rgb));#ifdef G	} else {		memcpy(&o.default_fg, &default_fg_g, sizeof(struct rgb));		memcpy(&o.default_bg, &default_bg_g, sizeof(struct rgb));		memcpy(&o.default_link, &default_link_g, sizeof(struct rgb));		memcpy(&o.default_vlink, &default_vlink_g, sizeof(struct rgb));#endif	}	if (!(o.framename = fd->loc->name)) o.framename = NULL;	doc_js = NULL;	link_js = DUMMY;	nlink_js = 0;	if (fd->f_data) {		copy_js_event_spec(&doc_js, fd->f_data->js_event);		if (fd->f_data->nlinks > fd->f_data->nlink_events) nlink_js = fd->f_data->nlinks; else nlink_js = fd->f_data->nlink_events;		if ((unsigned)nlink_js > MAXINT / sizeof(struct js_event_spec *)) overalloc();		link_js = mem_alloc(nlink_js * sizeof(struct js_event_spec *));		for (i = 0; i < fd->f_data->nlinks; i++) copy_js_event_spec(&link_js[i], fd->f_data->links[i].js_event);		for (; i < fd->f_data->nlink_events; i++) copy_js_event_spec(&link_js[i], fd->f_data->link_events[i]);	}	if (!(fd->f_data = cached_format_html(fd, fd->rq, fd->rq->url, &o, &cch))) {		for (i = 0; i < nlink_js; i++) free_js_event_spec(link_js[i]);		mem_free(link_js);		free_js_event_spec(doc_js);		goto d;	}	if (join_js_event_spec(&fd->f_data->js_event, doc_js)) fd->f_data->uncacheable = 1;	for (i = 0; i < fd->f_data->nlink_events; i++) free_js_event_spec(fd->f_data->link_events[i]);	mem_free(fd->f_data->link_events);	fd->f_data->link_events = link_js;	fd->f_data->nlink_events = nlink_js;	for (i = 0; i < fd->f_data->nlinks && i < nlink_js; i++) if (join_js_event_spec(&fd->f_data->links[i].js_event, link_js[i])) fd->f_data->uncacheable = 1;	free_js_event_spec(doc_js);	/* erase frames if changed */	i = 0;	foreach(sf, fd->subframes) i++;	if (i != (fd->f_data->frame_desc ? fd->f_data->frame_desc->n : 0) && (f_is_finished(fd->f_data) || !f_need_reparse(fd->f_data))) {		rd:		foreach(sf, fd->subframes) reinit_f_data_c(sf);		free_list(fd->subframes);		/* create new frames */		if (fd->f_data->frame_desc) create_new_frames(fd, fd->f_data->frame_desc, &fd->f_data->opt);	} else {		if (fd->f_data->frame_desc && fd->f_data->rq->state < 0) {			if (fd->f_data->opt.xw != oxw ||			    fd->f_data->opt.yw != oyw ||			    fd->f_data->opt.xp != oxp ||			    fd->f_data->opt.yp != oyp) goto rd;		}	}	d:;	/*draw_fd(fd);*/}void html_interpret_recursive(struct f_data_c *f){	struct f_data_c *fd;	if (f->rq) html_interpret(f);	foreach(fd, f->subframes) html_interpret_recursive(fd);}/* You get a struct_additionl_file. never mem_free it. When you stop * using it, just forget the pointer. */struct additional_file *request_additional_file(struct f_data *f, unsigned char *url_){	struct additional_file *af;	unsigned char *u, *url;	url = stracpy(url_);	if ((u = extract_position(url))) mem_free(u);	if (!f->af) {		if (!(f->af = f->fd->af)) {			f->af = f->fd->af = mem_calloc(sizeof(struct additional_files));			f->af->refcount = 1;			init_list(f->af->af);		}		f->af->refcount++;	}	foreach (af, f->af->af) if (!strcmp(af->url, url)) {		mem_free(url);		return af;	}	af = mem_alloc(sizeof(struct additional_file) + strlen(url) + 1);	af->use_tag = 0;	af->use_tag2 = 0;	strcpy(af->url, url);	request_object(f->ses->term, url, f->rq->url, PRI_IMG, NC_CACHE, f->rq->upcall, f->rq->data, &af->rq);	af->need_reparse = 0;	af->unknown_image_size = 0;	add_to_list(f->af->af, af);	mem_free(url);	return af;}#ifdef Gvoid image_timer(struct f_data_c *fd){	struct image_refresh *ir;	struct list_head new;	init_list(new);	fd->image_timer = -1;	if (!fd->f_data) return;	foreach (ir, fd->f_data->image_refresh) {		if (ir->t > G_IMG_REFRESH) ir->t -= G_IMG_REFRESH;		else {			struct image_refresh *irr = ir->prev;			del_from_list(ir);			add_to_list(new, ir);			ir = irr;		}	}	foreach (ir, new) {		/*fprintf(stderr, "DRAW: %p\n", ir->img);*/		draw_one_object(fd, ir->img);	}	free_list(new);	if (fd->image_timer == -1 && !list_empty(fd->f_data->image_refresh)) fd->image_timer = install_timer(G_IMG_REFRESH, (void (*)(void *))image_timer, fd);}void refresh_image(struct f_data_c *fd, struct g_object *img, ttime tm){	struct image_refresh *ir;	if (!fd->f_data) return;	foreach (ir, fd->f_data->image_refresh) if (ir->img == img) {		if (ir->t > tm) ir->t = tm;		return;	}	ir = mem_alloc(sizeof(struct image_refresh));	ir->img = img;	ir->t = tm;	add_to_list(fd->f_data->image_refresh, ir);	if (fd->image_timer == -1) fd->image_timer = install_timer(G_IMG_REFRESH, (void (*)(void *))image_timer, fd);}#endifvoid reinit_f_data_c(struct f_data_c *fd){	struct additional_file *af;	struct f_data_c *fd1;	jsint_destroy(fd);	foreach(fd1, fd->subframes) {		if (fd->ses->wtd_target_base == fd1) fd->ses->wtd_target_base = NULL;		reinit_f_data_c(fd1);		if (fd->ses->wtd_target_base == fd1) fd->ses->wtd_target_base = fd;		if (fd->ses->defered_target_base == fd1) fd->ses->defered_target_base = fd;	}	free_list(fd->subframes);#ifdef JS	if (fd->onload_frameset_code)mem_free(fd->onload_frameset_code),fd->onload_frameset_code=NULL;#endif	fd->loc = NULL;	if (fd->f_data && fd->f_data->rq) fd->f_data->rq->upcall = NULL;	if (fd->f_data && fd->f_data->af) foreach(af, fd->f_data->af->af) if (af->rq) {		af->rq->upcall = NULL;		if (af->rq->state != O_OK) release_object(&af->rq);	}	if (fd->af) foreach(af, fd->af->af) if(af->rq) af->rq->upcall = NULL;	detach_f_data(&fd->f_data);	if (fd->link_bg) mem_free(fd->link_bg), fd->link_bg = NULL;	fd->link_bg_n = 0;	if (fd->goto_position) mem_free(fd->goto_position), fd->goto_position = NULL;	if (fd->went_to_position) mem_free(fd->went_to_position), fd->went_to_position = NULL;	release_object(&fd->rq);	free_additional_files(&fd->af);	fd->next_update = get_time();	fd->done = 0;	fd->parsed_done = 0;	if (fd->image_timer != -1) kill_timer(fd->image_timer), fd->image_timer = -1;	if (fd->refresh_timer != -1) kill_timer(fd->refresh_timer), fd->refresh_timer = -1;}struct f_data_c *create_f_data_c(struct session *ses, struct f_data_c *parent){	static long id = 1;	struct f_data_c *fd;	fd = mem_calloc(sizeof(struct f_data_c));	fd->parent = parent;	fd->ses = ses;	fd->depth = parent ? parent->depth + 1 : 1;	init_list(fd->subframes);	fd->next_update = get_time();	fd->done = 0;	fd->parsed_done = 0;	fd->script_t = 0;	fd->id = id++;	fd->marginwidth = fd->marginheight = -1;	fd->image_timer = -1;	fd->refresh_timer = -1;	fd->scrolling = SCROLLING_AUTO;	return fd;}int plain_type(struct session *ses, struct object_request *rq, unsigned char **p){	struct cache_entry *ce;	unsigned char *ct;	int r = 0;	if (p) *p = NULL;	if (!rq || !(ce = rq->ce)) {		r = 1;		goto f;	}	if (!(ct = get_content_type(ce->head, ce->url))) goto f;	if (is_html_type(ct)) goto ff;	r = 1;	if (!strcasecmp(ct, "text/plain") || !strcasecmp(ct, "file/txt")) goto ff;	r = 2;	if (F && known_image_type(ct)) goto ff;	r = -1;	ff:	if (!p) mem_free(ct);	else *p = ct;	f:	return r;}#define DECODE_STEP	4096#if defined(HAVE_ZLIB) || defined(HAVE_BZIP2)static void decompress_error(struct terminal *term, struct cache_entry *ce, unsigned char *lib, unsigned char *msg, int *errp){	struct window *win;	unsigned char *u, *uu, *server;	if ((u = parse_http_header(ce->head, "Content-Encoding", NULL))) {		mem_free(u);		if ((server = get_host_name(ce->url))) {			add_blacklist_entry(server, BL_NO_COMPRESSION);			mem_free(server);		}	}	if (!term) return;	if (errp) *errp = 1;	else foreach(win, term->windows) if (win->handler == dialog_func) {		struct dialog_data *d = win->data;		if (d->dlg->title == TEXT(T_DECOMPRESSION_ERROR)) {			return;		}	}	u = stracpy(ce->url);	if ((uu = strchr(u, POST_CHAR))) *uu = 0;	msg_box(term, getml(u, NULL), TEXT(T_DECOMPRESSION_ERROR), AL_CENTER | AL_EXTD_TEXT, TEXT(T_ERROR_DECOMPRESSING_), u, TEXT(T__wITH_), lib, ": ", msg, NULL, NULL, 1, TEXT(T_CANCEL), NULL, B_ENTER | B_ESC);}#endif#ifdef HAVE_ZLIB#include <zlib.h>static int decode_gzip(struct terminal *term, struct cache_entry *ce, unsigned char **p_start, size_t *p_len, int defl, int *errp){	char err;	char skip_gzip_header;	char old_zlib;	z_stream z;	off_t offset;	size_t header = 0;	int r;	unsigned char *p;	struct fragment *f;	size_t size = ce->length > 0 ? (ce->length + DECODE_STEP - 1) & ~(size_t)(DECODE_STEP - 1) : DECODE_STEP;	p = mem_alloc(size);	init_again:	err = 0;	skip_gzip_header = 0;	old_zlib = 0;	memset(&z, 0, sizeof z);	z.next_in = NULL;	z.avail_in = 0;	z.next_out = p;	z.avail_out = size;	z.zalloc = NULL;	z.zfree = NULL;	z.opaque = NULL;	r = inflateInit2(&z, defl == 1 ? 15 : defl == 2 ? -15 : 15 + 16);	init_failed:	switch (r) {		case Z_OK:		break;		case Z_MEM_ERROR:	decompress_error(term, ce, "zlib", z.msg ? (unsigned char *)z.msg : TEXT(T_OUT_OF_MEMORY), errp);					err = 1;					goto after_inflateend;		case Z_STREAM_ERROR:						if (!defl && !old_zlib) {						defrag_entry(ce);						r = inflateInit2(&z, -15);						skip_gzip_header = 1;						old_zlib = 1;						goto init_failed;					}					decompress_error(term, ce, "zlib", z.msg ? (unsigned char *)z.msg : (unsigned char *)"Invalid parameter", errp);					err = 1;					goto after_inflateend;		case Z_VERSION_ERROR:	decompress_error(term, ce, "zlib", z.msg ? (unsigned char *)z.msg : (unsigned char *)"Bad zlib version", errp);					err = 1;					goto after_inflateend;		default:		decompress_error(term, ce, "zlib", z.msg ? (unsigned char *)z.msg : (unsigned char *)"Unknown return value on inflateInit2", errp);					err = 1;					goto after_inflateend;	}	offset = 0;	foreach(f, ce->frag) {		if (f->offset != offset) break;		z.next_in = f->data;		z.avail_in = f->length;		if (header && !offset) {			z.next_in = (unsigned char *)z.next_in + header;			z.avail_in -= header;		}		repeat_frag:		if (skip_gzip_header == 2) {			if (z.avail_in < 8) goto finish;			z.next_in = (unsigned char *)z.next_in + 8;			z.avail_in -= 8;			skip_gzip_header = 1;		}		if (skip_gzip_header) {			/* if zlib is old, we have to skip gzip header manually			   otherwise zlib 1.2.x can do it automatically */			unsigned char *head = z.next_in;			unsigned headlen = 10;			if (z.avail_in <= 11) goto finish;			if (head[0] != 0x1f || head[1] != 0x8b) {				decompress_error(term, ce, "zlib", TEXT(T_COMPRESSED_ERROR), errp);				err = 1;				goto finish;			}			if (head[2] != 8 || head[3] & 0xe0) {				decompress_error(term, ce, "zlib", TEXT(T_UNKNOWN_COMPRESSION_METHOD), errp);				err = 1;				goto finish;			}			if (head[3] & 0x04) {				headlen += 2 + head[10] + (head[11] << 8);				if (headlen >= z.avail_in) goto finish;			}			if (head[3] & 0x08) {				do {					headlen++;					if (headlen >= z.avail_in) goto finish;				} while (head[headlen - 1]);			}			if (head[3] & 0x10) {				do {					headlen++;					if (headlen >= z.avail_in) goto finish;				} while (head[headlen - 1]);			}			if (head[3] & 0x01) {				headlen += 2;				if (headlen >= z.avail_in) goto finish;			}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -