Annotation of libwww/Library/src/HTLink.c, revision 2.4

2.1       frystyk     1: /*
                      2: **     HYPERTEXT LINK CLASS
                      3: **
                      4: **     (c) COPYRIGHT MIT 1995.
                      5: **     Please first read the full copyright statement in the file COPYRIGH.
2.4     ! frystyk     6: **     @(#) $Id: HTLink.c,v 2.3 1999/02/22 22:10:11 frystyk Exp $
2.1       frystyk     7: **
                      8: **     An anchor represents a region of a hypertext document which is
                      9: **     linked to another anchor in the same or a different document.
                     10: **
                     11: ** History
                     12: **         Nov 1990  Written in Objective-C for the NeXT browser (TBL)
                     13: **     24-Oct-1991 (JFG), written in C, browser-independant 
                     14: **     21-Nov-1991 (JFG), first complete version
                     15: **      3-May-1995 (HF), Added a lot of methods and other stuff made an object
                     16: **                 HF - moved all Link stuff to HTLink
                     17: */
                     18: 
                     19: /* Library include files */
2.2       frystyk    20: #include "wwwsys.h"
2.1       frystyk    21: #include "WWWUtil.h"
                     22: #include "HTFormat.h"
                     23: #include "HTParse.h"
                     24: #include "HTMethod.h"
                     25: #include "HTAncMan.h"
                     26: #include "HTLink.h"                                     /* Implemented here */
                     27: 
                     28: /* ------------------------------------------------------------------------- */
                     29: 
                     30: PUBLIC HTLink * HTLink_new (void)
                     31: {
                     32:     HTLink * link;
                     33:     if ((link = (HTLink *) HT_CALLOC(1, sizeof (HTLink))) == NULL)
                     34:         HT_OUTOFMEM("HTLink_new");
                     35:     return link;
                     36: }
                     37: 
                     38: PUBLIC BOOL HTLink_delete (HTLink * me)
                     39: {
                     40:     HT_FREE(me);
                     41:     return YES;
                     42: }
                     43: 
                     44: /*     Link me Anchor to another given one
                     45: **     -------------------------------------
                     46: */
                     47: PUBLIC BOOL HTLink_add (HTAnchor *     source,
                     48:                        HTAnchor *      destination, 
                     49:                        HTLinkType      type,
                     50:                        HTMethod        method)
                     51: {
                     52:     if (source && destination) {
2.3       frystyk    53:        HTTRACE(ANCH_TRACE, "Link create. from anchor %p to %p with type %s, method %s\n" _ 
                     54:                    (void *) source _ (void *) destination _ 
                     55:                    type ? HTAtom_name(type) : "NONE" _ 
2.1       frystyk    56:                    method != METHOD_INVALID ? HTMethod_name(method) : "NONE");
                     57:        if (!source->mainLink.dest) {
                     58:            source->mainLink.dest = destination;
                     59:            source->mainLink.type = type;
                     60:            source->mainLink.method = method;
                     61:        } else {
                     62:            HTLink * newLink = HTLink_new();
                     63:            newLink->dest = destination;
                     64:            newLink->type = type;
                     65:            newLink->method = method;
                     66:            if (!source->links) source->links = HTList_new();
                     67:            HTList_addObject (source->links, newLink);
                     68:        }
                     69:        if (!destination->parent->sources)
                     70:            destination->parent->sources = HTList_new();
                     71:        HTList_addObject (destination->parent->sources, source);
                     72:        return YES;
                     73:     } else
2.3       frystyk    74:        HTTRACE(ANCH_TRACE, "Link........ Bad argument\n");
2.1       frystyk    75:     return NO;
                     76: }
                     77: 
                     78: /*
                     79: **  Removes link information from one anchor to another.
                     80: **  Returns YES if OK, else NO
                     81: */
                     82: PUBLIC BOOL HTLink_remove (HTAnchor * source, HTAnchor * destination)
                     83: {
                     84:     if (!source || !destination) return NO;
2.3       frystyk    85:     HTTRACE(ANCH_TRACE, "Link delete. from anchor %p to anchor %p\n" _ 
                     86:                (void *) source _ (void *) destination);
2.1       frystyk    87: 
                     88:     /* Remove if dest is the main link */
                     89:     if (source->mainLink.dest == destination) {
                     90:        source->mainLink.dest = NULL;
                     91:        source->mainLink.type = NULL;
                     92:        source->mainLink.method = METHOD_INVALID;
                     93:        source->mainLink.result = HT_LINK_INVALID;
                     94:        return YES;
                     95:     }
                     96: 
                     97:     /* Remove link information for other links */
2.4     ! frystyk    98:     if (source->links) {
        !            99:        HTList *cur = source->links;
2.1       frystyk   100:        HTLink *pres;
                    101:        while ((pres = (HTLink *) HTList_nextObject(cur))) {
                    102:            if (pres->dest == destination) {
2.4     ! frystyk   103:                HTList_removeObject(source->links, pres);
2.1       frystyk   104:                HT_FREE(pres);
                    105:                return YES;
                    106:            }
                    107:        }
                    108:     }
                    109:     return NO;
                    110: }
                    111: 
                    112: /*
                    113: **  Removes all link information
                    114: **  Returns YES if OK, else NO
                    115: */
                    116: PUBLIC BOOL HTLink_removeAll (HTAnchor * me)
                    117: {
                    118:     if (!me) return NO;
2.3       frystyk   119:     HTTRACE(ANCH_TRACE, "Link delete. from anchor %p\n" _ (void *) me);
2.1       frystyk   120: 
                    121:     /* Remove if dest is the main link */
                    122:     me->mainLink.dest = NULL;
                    123:     me->mainLink.type = NULL;
                    124:     me->mainLink.method = METHOD_INVALID;
                    125:     me->mainLink.result = HT_LINK_INVALID;
                    126: 
                    127:     /* Remove link information for other links */
                    128:     if (me->links) {
                    129:        HTList *cur = me->links;
                    130:        HTLink *pres;
                    131:        while ((pres = (HTLink *) HTList_nextObject(cur)))
                    132:            HT_FREE(pres);
                    133:        HTList_delete(me->links);
                    134:        me->links = NULL;
                    135:     }
                    136:     return YES;
                    137: }
                    138: 
                    139: /*
                    140: **  Moves all link information from one anchor to another.
                    141: **  This is used in redirection etc.
                    142: **  Returns YES if OK, else NO
                    143: */
                    144: PUBLIC BOOL HTLink_moveAll (HTAnchor * src, HTAnchor * dest)
                    145: {
                    146:     if (!src || !dest) return NO;
2.3       frystyk   147:     HTTRACE(ANCH_TRACE, "Link move... all from anchor %p to anchor %p\n" _ 
                    148:                (void *) src _ (void *) dest);
2.1       frystyk   149: 
                    150:     /* Move main link information */
                    151:     dest->mainLink.dest = src->mainLink.dest;
                    152:     dest->mainLink.type = src->mainLink.type;
                    153:     dest->mainLink.method = src->mainLink.method;
                    154:     dest->mainLink.result = src->mainLink.result;
                    155: 
                    156:     src->mainLink.dest = NULL;
                    157:     src->mainLink.type = NULL;
                    158:     src->mainLink.method = METHOD_INVALID;
                    159:     src->mainLink.result = HT_LINK_INVALID;
                    160: 
                    161:     /* Move link information for other links */
                    162:     if (dest->links) {
                    163:        HTList *cur = dest->links;
                    164:        HTLink *pres;
                    165:        while ((pres = (HTLink *) HTList_nextObject(cur)))
                    166:            HT_FREE(pres);
                    167:        HTList_delete(dest->links);
                    168:     }
                    169:     dest->links = src->links;
                    170:     src->links = NULL;
                    171:     return YES;
                    172: }
                    173: 
                    174: /*
                    175: **  Find the anchor object between a destination and a source ancher.
                    176: **  Return link object if any, else NULL
                    177: */
                    178: PUBLIC HTLink * HTLink_find (HTAnchor * src, HTAnchor * dest)
                    179: {
                    180:     if (src && dest) {
                    181:        if (src->mainLink.dest == dest)
                    182:            return &(src->mainLink);
                    183:        if (src->links) {
                    184:            HTList *cur = src->links;
                    185:            HTLink *pres;
                    186:            while ((pres = (HTLink *) HTList_nextObject(cur)) != NULL) {
                    187:                if (pres->dest == dest)
                    188:                    return pres;
                    189:            }
                    190:        }
                    191:     }
                    192:     return NULL;
                    193: }
                    194: 
                    195: /*
                    196: **  Returns a link with a given link type or NULL if nothing found
                    197: */
                    198: PUBLIC HTLink * HTLink_findType (HTAnchor * me, HTLinkType type)
                    199: {
                    200:     if (me) {
                    201:        HTLink * link = HTAnchor_mainLink(me);
                    202:        HTList * sublinks = HTAnchor_subLinks(me);
                    203:        if (link && link->type==type)
                    204:            return link;
                    205:        else if (sublinks) {
                    206:            while ((link = (HTLink *) HTList_nextObject (sublinks)))
                    207:                if (link->type == type) return link;
                    208:        }
                    209:     }
                    210:     return NULL;
                    211: }
                    212: 
                    213: /*
                    214: **     Link destinations
                    215: */
                    216: PUBLIC BOOL HTLink_setDestination (HTLink * link, HTAnchor * dest)
                    217: {
                    218:     if (link) {
                    219:        link->dest = dest;
                    220:        return YES;
                    221:     }
                    222:     return NO;
                    223: }
                    224: 
                    225: PUBLIC HTAnchor * HTLink_destination (HTLink * link)
                    226: {
                    227:     return link ? link->dest : NULL;
                    228: }
                    229: 
                    230: PUBLIC BOOL HTLink_setType (HTLink * link, HTLinkType type)
                    231: {
                    232:     if (link) {
                    233:        link->type = type;
                    234:        return YES;
                    235:     }
                    236:     return NO;
                    237: }
                    238: 
                    239: PUBLIC HTLinkType HTLink_type (HTLink * link)
                    240: {
                    241:     return link ? link->type : NULL;
                    242: }
                    243: 
                    244: /* 
                    245: **  When a link has been used for posting an object from a source to a
                    246: **  destination link, the result of the operation is stored as part of the
                    247: **  link information.
                    248: */
                    249: PUBLIC BOOL HTLink_setResult (HTLink * link, HTLinkResult result)
                    250: {
                    251:     if (link) {
                    252:        link->result = result;
                    253:        return YES;
                    254:     }
                    255:     return NO;
                    256: }
                    257: 
                    258: PUBLIC HTLinkResult HTLink_result (HTLink * link)
                    259: {
                    260:     return link ? link->result : HT_LINK_INVALID;
                    261: }
                    262: 
                    263: PUBLIC BOOL HTLink_setMethod (HTLink * link, HTMethod method)
                    264: {
                    265:     if (link) {
                    266:        link->method = method;
                    267:        return YES;
                    268:     }
                    269:     return NO;
                    270: }
                    271: 
                    272: PUBLIC HTMethod HTLink_method (HTLink * link)
                    273: {
                    274:     return link ? link->method : METHOD_INVALID;
                    275: }

Webmaster