/* /Net/dxcern/userd/timbl/hypertext/WWW/Library/Implementation/HTAnchor.html
*/
/* 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-independant */
#include "HTList.h"
#include "HTAtom.h"
#ifdef SHORT_NAMES
#define HTAnchor_findChild HTAnFiCh
#define HTAnchor_findChildAndLink HTAnFiLi
#define HTAnchor_findAddress HTAnFiAd
#define HTAnchor_delete HTAnDele
#define HTAnchor_makeLastChild HTAnMaLa
#define HTAnchor_parent HTAnPare
#define HTAnchor_setDocument HTAnSeDo
#define HTAnchor_document HTAnDocu
#define HTAnchor_setFormat HTAnSeFo
#define HTAnchor_format HTAnForm
#define HTAnchor_setIndex HTAnSeIn
#define HTAnchor_setPrompt HTAnSePr
#define HTAnchor_isIndex HTAnIsIn
#define HTAnchor_address HTAnAddr
#define HTAnchor_hasChildren HTAnHaCh
#define HTAnchor_title HTAnTitl
#define HTAnchor_setTitle HTAnSeTi
#define HTAnchor_appendTitle HTAnApTi
#define HTAnchor_link HTAnLink
#define HTAnchor_followMainLink HTAnFoMa
#define HTAnchor_followTypedLink HTAnFoTy
#define HTAnchor_makeMainLink HTAnMaMa
#define HTAnchor_setProtocol HTAnSePr
#define HTAnchor_protocol HTAnProt
#define HTAnchor_physical HTAnPhys
#define HTAnchor_setPhysical HTAnSePh
#define HTAnchor_methods HtAnMeth
#endif
/* Main definition of anchor
** =========================
*/
typedef struct _HyperDoc HyperDoc; /* Ready for forward references */
typedef struct _HTAnchor HTAnchor;
typedef struct _HTParentAnchor HTParentAnchor;
/* After definition of HTFormat: */
#include "HTFormat.h"
typedef HTAtom HTLinkType;
typedef struct {
HTAnchor * dest; /* The anchor to which this leads */
HTLinkType * type; /* Semantics of this link */
} HTLink;
struct _HTAnchor { /* Generic anchor : just links */
HTLink mainLink; /* Main (or default) destination of this */
HTList * links; /* List of extra links from this, if any */
/* We separate the first link from the others to avoid too many small mallocs
involved by a list creation. Most anchors only point to one place. */
HTParentAnchor * parent; /* Parent of this anchor (self for adults) */
};
struct _HTParentAnchor {
/* Common part from the generic anchor structure */
HTLink mainLink; /* Main (or default) destination of this */
HTList * links; /* List of extra links from this, if any */
HTParentAnchor * parent; /* Parent of this anchor (self) */
/* ParentAnchor-specific information */
HTList * children; /* Subanchors of this, if any */
HTList * sources; /* List of anchors pointing to this, if any */
HyperDoc * document; /* The document within which this is an anchor */
char * address; /* Absolute address of this node */
char * post_data; /* posting data */
char * post_content_type; /* type of post data */
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 */
HTList* methods; /* Methods available as HTAtoms */
void * protocol; /* Protocol object */
char * physical; /* Physical address */
BOOL underway; /* Document about to be attached to it */
BOOL isISMAPScript; /* Script for clickable image map */
BOOL isHEAD; /* Document is headers from a HEAD request */
char * FileCache; /* Path to a disk-cached copy */
char * cache_control; /* Cache-Control */
BOOL no_cache; /* Cache-Control, Pragma or META "no-cache"? */
char * content_type; /* Content-Type */
char * content_language; /* Content-Language */
char * content_encoding; /* Compression algorithm */
};
typedef struct {
/* Common part from the generic anchor structure */
HTLink mainLink; /* Main (or default) destination of this */
HTList * links; /* List of extra links from this, if any */
HTParentAnchor * parent; /* Parent of this anchor */
/* ChildAnchor-specific information */
char * tag; /* Address of this anchor relative to parent */
} 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;
char * post_data;
char * post_content_type;
BOOL isHEAD;
} DocAddress;
/* Create new or find old sub-anchor
** ---------------------------------
**
** This one is for a new anchor being edited into an existing
** document. The parent anchor must already exist.
*/
extern HTChildAnchor * HTAnchor_findChild
PARAMS(
(HTParentAnchor *parent,
CONST char *tag)
);
/* 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
PARAMS((
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 named 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 HTAnchor * HTAnchor_findAddress PARAMS((CONST DocAddress * address));
/* 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 parent and children are deleted, and this anchor
** is removed from the sources list of all its targets.
** We also try to delete the targets whose documents are not loaded.
** If this anchor's source list is empty, we delete it and its children.
*/
extern BOOL HTAnchor_delete
PARAMS(
(HTParentAnchor *me)
);
/* Move an anchor to the head of the list of its siblings
** ------------------------------------------------------
**
** This is to ensure that an anchor which might have already existed
** is put in the correct order as we load the document.
*/
extern void HTAnchor_makeLastChild
PARAMS(
(HTChildAnchor *me)
);
/* Data access functions
** ---------------------
*/
extern HTParentAnchor * HTAnchor_parent
PARAMS(
(HTAnchor *me)
);
extern void HTAnchor_setDocument
PARAMS(
(HTParentAnchor *me, HyperDoc *doc)
);
extern HyperDoc * HTAnchor_document
PARAMS(
(HTParentAnchor *me)
);
/* We don't want code to change an address after anchor creation... yet ?
extern void HTAnchor_setAddress
PARAMS(
(HTAnchor *me, char *addr)
);
*/
/* 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
PARAMS(
(HTAnchor *me)
);
extern void HTAnchor_setFormat
PARAMS(
(HTParentAnchor *me, HTFormat form)
);
extern HTFormat HTAnchor_format
PARAMS(
(HTParentAnchor *me)
);
extern void HTAnchor_setIndex
PARAMS(
(HTParentAnchor *me, char * address)
);
extern void HTAnchor_setPrompt
PARAMS(
(HTParentAnchor *me, char * prompt)
);
extern BOOL HTAnchor_isIndex
PARAMS(
(HTParentAnchor *me)
);
extern BOOL HTAnchor_hasChildren
PARAMS(
(HTParentAnchor *me)
);
/* Title handling
*/
extern CONST char * HTAnchor_title
PARAMS(
(HTParentAnchor *me)
);
extern void HTAnchor_setTitle
PARAMS(
(HTParentAnchor *me, CONST char * title)
);
extern void HTAnchor_appendTitle
PARAMS(
(HTParentAnchor *me, CONST char * title)
);
/* Owner handling
*/
extern CONST char * HTAnchor_owner
PARAMS(
(HTParentAnchor *me)
);
extern void HTAnchor_setOwner
PARAMS(
(HTParentAnchor *me, CONST char * owner)
);
/* TITLE handling in LINKs with REV="made" or REV="owner"
*/
extern CONST char * HTAnchor_RevTitle
PARAMS(
(HTParentAnchor *me)
);
extern void HTAnchor_setRevTitle
PARAMS(
(HTParentAnchor *me, CONST char * title)
);
/* Link this Anchor to another given one
** -------------------------------------
*/
extern BOOL HTAnchor_link
PARAMS(
(HTAnchor *source, HTAnchor *destination, HTLinkType *type)
);
/* Manipulation of links
** ---------------------
*/
extern HTAnchor * HTAnchor_followMainLink
PARAMS(
(HTAnchor *me)
);
extern HTAnchor * HTAnchor_followTypedLink
PARAMS(
(HTAnchor *me, HTLinkType *type)
);
extern BOOL HTAnchor_makeMainLink
PARAMS(
(HTAnchor *me, HTLink *movingLink)
);
/* Read and write methods
** ----------------------
*/
extern HTList * HTAnchor_methods PARAMS((HTParentAnchor *me));
/* Protocol
** --------
*/
extern void * HTAnchor_protocol PARAMS((HTParentAnchor * me));
extern void HTAnchor_setProtocol PARAMS((HTParentAnchor * me,
void* protocol));
/* Physical address
** ----------------
*/
extern char * HTAnchor_physical PARAMS((HTParentAnchor * me));
extern void HTAnchor_setPhysical PARAMS((HTParentAnchor * me,
char * protocol));
#endif /* HTANCHOR_H */
/*
*/