summaryrefslogtreecommitdiffstats
path: root/WWW/Library/Implementation/HTAnchor.h
blob: 3b1e6e68f2e358782507c1adb3831f17e34b65ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
/*
 * $LynxId: HTAnchor.h,v 1.40 2018/03/11 18:43:50 tom Exp $
 *
 *	Hypertext "Anchor" Object				     HTAnchor.h
 *	==========================
 *
 *	An anchor represents a region of a hypertext document which is linked
 *	to another anchor in the same or a different document.
 */

#ifndef HTANCHOR_H
#define HTANCHOR_H

/* Version 0 (TBL) written in Objective-C for the NeXT browser */
/* Version 1 of 24-Oct-1991 (JFG), written in C, browser-independent */

#include <HTList.h>
#include <HTBTree.h>
#include <HTChunk.h>
#include <HTAtom.h>
#include <UCDefs.h>

typedef struct _HyperDoc HyperDoc;	/* Ready for forward references */
typedef struct _HTAnchor HTAnchor;
typedef struct _HTParentAnchor HTParentAnchor;
typedef struct _HTParentAnchor0 HTParentAnchor0;

#include <HTFormat.h>

#ifdef __cplusplus
extern "C" {
#endif
    struct _HTAnchor {
	/* Generic anchor */
	HTParentAnchor0 *parent;	/* Parent of this anchor (self for adults) */
    };

#define HASH_TYPE unsigned short

    struct _HTParentAnchor0 {	/* One for adult_table,
				 * generally not used outside HTAnchor.c */
	/* Common part from the generic anchor structure */
	HTParentAnchor0 *parent;	/* (self) */

	/* ParentAnchor0-specific information */
	char *address;		/* Absolute address of this node */
	HTParentAnchor *info;	/* additional info, allocated on demand */

	HTBTree *children;	/* Subanchors <a name="tag">, sorted by tag */
	HTList sources;		/* List of anchors pointing to this, if any */

	HTList _add_adult;	/* - just a memory for list entry:) */
	HASH_TYPE adult_hash;	/* adult list number */
	BOOL underway;		/* Document about to be attached to it */
    };

    /*
     *  Separated from the above to save memory:  allocated on demand,
     *  it is nearly 1:1 to HText (well, sometimes without HText...),
     *  available for SGML, HTML, and HText stages.
     *  [being precise, we currently allocate it before HTLoadDocument(),
     *  in HTAnchor_findAddress() and HTAnchor_parent()].
     */
    struct _HTParentAnchor {
	/* Common part from the generic anchor structure */
	HTParentAnchor0 *parent;	/* Parent of this anchor */

	/* ParentAnchor-specific information */
	HTList children_notag;	/* Subanchors <a href=...>, tag is NULL */
	HyperDoc *document;	/* The document within which this is an anchor */

	char *address;		/* parent->address, a pointer */
	bstring *post_data;	/* Posting data */
	char *post_content_type;	/* Type of post data */
	char *bookmark;		/* Bookmark filename */
	HTFormat format;	/* Pointer to node format descriptor */
	char *charset;		/* Pointer to character set (kludge, for now */
	BOOL isIndex;		/* Acceptance of a keyword search */
	char *isIndexAction;	/* URL of isIndex server */
	char *isIndexPrompt;	/* Prompt for isIndex query */
	char *title;		/* Title of document */
	char *owner;		/* Owner of document */
	char *RevTitle;		/* TITLE in REV="made" or REV="owner" LINK */
	char *citehost;		/* Citehost from REL="citehost" LINK */
#ifdef USE_COLOR_STYLE
	char *style;
#endif

	HTList *methods;	/* Methods available as HTAtoms */
	void *protocol;		/* Protocol object */
	char *physical;		/* Physical address */
	BOOL isISMAPScript;	/* Script for clickable image map */
	BOOL isHEAD;		/* Document is headers from a HEAD request */
	BOOL safe;		/* Safe */
#ifdef USE_SOURCE_CACHE
	char *source_cache_file;
	HTChunk *source_cache_chunk;
#endif
	char *FileCache;	/* Path to a disk-cached copy (see src/HTFWriter.c) */
	char *SugFname;		/* Suggested filename */
	char *cache_control;	/* Cache-Control */
	BOOL no_cache;		/* Cache-Control, Pragma or META "no-cache"? */
	BOOL inHEAD;		/* HTMIMEConvert is decoding server-headers */
	BOOL inBASE;		/* duplicated from HTStructured (HTML.c/h) */
	HTChunk http_headers;
	BOOL no_content_encoding;	/* server did not use C-T? */
	char *content_type_params;	/* Content-Type (with parameters if any) */
	char *content_type;	/* Content-Type */
	char *content_language;	/* Content-Language */
	char *content_encoding;	/* Compression algorithm */
	char *content_base;	/* Content-Base */
	char *content_disposition;	/* Content-Disposition */
	char *content_location;	/* Content-Location */
	char *content_md5;	/* Content-MD5 */
	char *message_id;	/* Message-ID */
	char *subject;		/* Subject */
	off_t header_length;	/* length of headers */
	off_t content_length;	/* Content-Length */
	off_t actual_length;	/* actual length may differ */
	char *date;		/* Date */
	char *expires;		/* Expires */
	char *last_modified;	/* Last-Modified */
	char *ETag;		/* ETag (HTTP1.1 cache validator) */
	char *server;		/* Server */
	UCAnchorInfo *UCStages;	/* chartrans stages */
	HTList *imaps;		/* client side image maps */
    };

    typedef HTAtom HTLinkType;

    typedef struct {
	/* Common part from the generic anchor structure */
	HTParentAnchor0 *parent;	/* Parent of this anchor */

	/* ChildAnchor-specific information */
	char *tag;		/* #fragment,  relative to the parent */

	HTAnchor *dest;		/* The anchor to which this leads */
	HTLinkType *type;	/* Semantics of this link */

	HTList _add_children_notag;	/* - just a memory for list entry:) */
	HTList _add_sources;	/* - just a memory for list entry:) */
    } HTChildAnchor;

    /*
     *  DocAddress structure is used for loading an absolute anchor with all
     *  needed information including posting data and post content type.
     */
    typedef struct _DocAddress {
	char *address;
	bstring *post_data;
	char *post_content_type;
	char *bookmark;
	BOOL isHEAD;
	BOOL safe;
    } DocAddress;

    /* "internal" means "within the same document, with certainty". */
    extern HTLinkType *HTInternalLink;

    /* Create or find a child anchor with a possible link
     * --------------------------------------------------
     *
     * Create new anchor with a given parent and possibly
     * a name, and possibly a link to a _relatively_ named anchor.
     * (Code originally in ParseHTML.h)
     */
    extern HTChildAnchor *HTAnchor_findChildAndLink(HTParentAnchor *parent,	/* May not be 0 */
						    const char *tag,	/* May be "" or 0 */
						    const char *href,	/* May be "" or 0 */
						    HTLinkType *ltype);		/* May be 0 */

    /* Create new or find old parent anchor
     * ------------------------------------
     *
     * This one is for a reference which is found in a document, and might
     * not be already loaded.
     * Note: You are not guaranteed a new anchor -- you might get an old one,
     * like with fonts.
     */
    extern HTParentAnchor *HTAnchor_findAddress(const DocAddress *address);

    /* Create new or find old named anchor - simple form
     * -------------------------------------------------
     *
     * Like the previous one, but simpler to use for simple cases.
     * No post data etc.  can be supplied.  - kw
     */
    extern HTParentAnchor *HTAnchor_findSimpleAddress(const char *url);

    /* Delete an anchor and possibly related things (auto garbage collection)
     * --------------------------------------------
     *
     * The anchor is only deleted if the corresponding document is not loaded.
     * All outgoing links from children are deleted, and children are
     * removed from the sources lists of their targets.
     * We also try to delete the targets whose documents are not loaded.
     * If this anchor's sources list is empty, we delete it and its children.
     */
    extern BOOL HTAnchor_delete(HTParentAnchor0 *me);

    /*
     * Unnamed children (children_notag) have no sense without HText -
     * delete them and their links if we are about to free HText.
     * Document currently exists.  Called within HText_free().
     */
    extern void HTAnchor_delete_links(HTParentAnchor *me);

#ifdef USE_SOURCE_CACHE
    extern void HTAnchor_clearSourceCache(HTParentAnchor *me);
#endif

    /* Data access functions
     * ---------------------
     */
    extern HTParentAnchor *HTAnchor_parent(HTAnchor * me);

    extern void HTAnchor_setDocument(HTParentAnchor *me,
				     HyperDoc *doc);

    extern HyperDoc *HTAnchor_document(HTParentAnchor *me);

    /* Returns the full URI of the anchor, child or parent
     * as a malloc'd string to be freed by the caller.
     */
    extern char *HTAnchor_address(HTAnchor * me);

    extern char *HTAnchor_short_address(HTAnchor * me);

    extern void HTAnchor_setFormat(HTParentAnchor *me,
				   HTFormat form);

    extern HTFormat HTAnchor_format(HTParentAnchor *me);

    extern void HTAnchor_setIndex(HTParentAnchor *me,
				  const char *address);

    extern void HTAnchor_setPrompt(HTParentAnchor *me,
				   const char *prompt);

    extern BOOL HTAnchor_isIndex(HTParentAnchor *me);

    extern BOOL HTAnchor_isISMAPScript(HTAnchor * me);

#if defined(USE_COLOR_STYLE)
    extern const char *HTAnchor_style(HTParentAnchor *me);

    extern void HTAnchor_setStyle(HTParentAnchor *me,
				  const char *style);
#endif

    /* Title handling.
     */
    extern const char *HTAnchor_title(HTParentAnchor *me);

    extern void HTAnchor_setTitle(HTParentAnchor *me,
				  const char *title);

    extern void HTAnchor_appendTitle(HTParentAnchor *me,
				     const char *title);

    /* Bookmark handling.
     */
    extern const char *HTAnchor_bookmark(HTParentAnchor *me);

    extern void HTAnchor_setBookmark(HTParentAnchor *me,
				     const char *bookmark);

    /* Owner handling.
     */
    extern const char *HTAnchor_owner(HTParentAnchor *me);

    extern void HTAnchor_setOwner(HTParentAnchor *me,
				  const char *owner);

    /* TITLE handling in LINKs with REV="made" or REV="owner".  - FM
     */
    extern const char *HTAnchor_RevTitle(HTParentAnchor *me);

    extern void HTAnchor_setRevTitle(HTParentAnchor *me,
				     const char *title);

    /* Citehost for bibp links from LINKs with REL="citehost".  - RDC
     */
    extern const char *HTAnchor_citehost(HTParentAnchor *me);

    extern void HTAnchor_setCitehost(HTParentAnchor *me,
				     const char *citehost);

    /* Suggested filename handling.  - FM
     * (will be loaded if we had a Content-Disposition
     * header or META element with filename=name.suffix)
     */
    extern const char *HTAnchor_SugFname(HTParentAnchor *me);

    /* HTTP Headers.
     */
    extern const char *HTAnchor_http_headers(HTParentAnchor *me);

    /* Content-Type handling (parameter list).
     */
    extern const char *HTAnchor_content_type_params(HTParentAnchor *me);

    /* Content-Type handling.  - FM
     */
    extern const char *HTAnchor_content_type(HTParentAnchor *me);

    /* Content-Encoding handling.  - FM
     * (will be loaded if we had a Content-Encoding
     * header.)
     */
    extern const char *HTAnchor_content_encoding(HTParentAnchor *me);

    /* Last-Modified header handling.  - FM
     */
    extern const char *HTAnchor_last_modified(HTParentAnchor *me);

    /* Date header handling.  - FM
     */
    extern const char *HTAnchor_date(HTParentAnchor *me);

    /* Server header handling.  - FM
     */
    extern const char *HTAnchor_server(HTParentAnchor *me);

    /* Safe header handling.  - FM
     */
    extern BOOL HTAnchor_safe(HTParentAnchor *me);

    /* Content-Base header handling.  - FM
     */
    extern const char *HTAnchor_content_base(HTParentAnchor *me);

    /* Content-Location header handling.  - FM
     */
    extern const char *HTAnchor_content_location(HTParentAnchor *me);

    /* Message-ID, used for mail replies - kw
     */
    extern const char *HTAnchor_messageID(HTParentAnchor *me);

    extern BOOL HTAnchor_setMessageID(HTParentAnchor *me,
				      const char *messageid);

    /* Subject, used for mail replies - kw
     */
    extern const char *HTAnchor_subject(HTParentAnchor *me);

    extern BOOL HTAnchor_setSubject(HTParentAnchor *me,
				    const char *subject);

    /* Manipulation of links
     * ---------------------
     */
    extern HTAnchor *HTAnchor_followLink(HTChildAnchor *me);

    extern HTAnchor *HTAnchor_followTypedLink(HTChildAnchor *me,
					      HTLinkType *type);

    /* Read and write methods
     * ----------------------
     */
    extern HTList *HTAnchor_methods(HTParentAnchor *me);

    /* Protocol
     * --------
     */
    extern void *HTAnchor_protocol(HTParentAnchor *me);

    extern void HTAnchor_setProtocol(HTParentAnchor *me,
				     void *protocol);

    /* Physical address
     * ----------------
     */
    extern char *HTAnchor_physical(HTParentAnchor *me);

    extern void HTAnchor_setPhysical(HTParentAnchor *me,
				     char *protocol);

    extern LYUCcharset *HTAnchor_getUCInfoStage(HTParentAnchor *me,
						int which_stage);

    extern int HTAnchor_getUCLYhndl(HTParentAnchor *me,
				    int which_stage);

    extern LYUCcharset *HTAnchor_setUCInfoStage(HTParentAnchor *me,
						int LYhndl,
						int which_stage,
						int set_by);

    extern LYUCcharset *HTAnchor_setUCInfoStage(HTParentAnchor *me,
						int LYhndl,
						int which_stage,
						int set_by);

    extern LYUCcharset *HTAnchor_resetUCInfoStage(HTParentAnchor *me,
						  int LYhndl,
						  int which_stage,
						  int set_by);

    extern LYUCcharset *HTAnchor_copyUCInfoStage(HTParentAnchor *me,
						 int to_stage,
						 int from_stage,
						 int set_by);

    extern void ImageMapList_free(HTList *list);

#ifdef __cplusplus
}
#endif
#endif				/* HTANCHOR_H */