[BACK] Return to HTLink.c CVS log [TXT] [DIR] Up to [Public] / libwww / Library / src

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

AltStyle によって変換されたページ (->オリジナル) /