/* /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 */ /* */