📄 session.c
字号:
/*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 + -