Annotation of Amaya/amaya/AHTURLTools.c, revision 1.5

1.4       cvs         1: /***
                      2:  *** Copyright (c) 1996 INRIA, All rights reserved
                      3:  ***/
1.3       cvs         4: 
                      5: #include "amaya.h"
                      6: 
                      7: #include "dialog.h"
                      8: #include "content.h"
                      9: #include "view.h"
                     10: #include "interface.h"
                     11: #include "message.h"
                     12: #include "conststr.h"
                     13: #include "AHTMemConv.h"
                     14: #include "init.h"
1.5     ! cvs        15: #include "AHTURLTools.h"       /* defined here */
1.3       cvs        16: 
1.4       cvs        17: /*----------------------------------------------------------------------
                     18:    IsHTMLName                                                         
                     19:   ----------------------------------------------------------------------*/
1.3       cvs        20: 
                     21: #ifdef __STDC__
                     22: boolean             IsHTMLName (char *path)
                     23: #else  /* __STDC__ */
                     24: boolean             IsHTMLName (path)
                     25: char               *path;
                     26: 
                     27: #endif /* __STDC__ */
                     28: {
1.5     ! cvs        29:    char                temppath[MAX_LENGTH];
        !            30:    char                suffix[MAX_LENGTH];
        !            31:    char                nsuffix[MAX_LENGTH];
        !            32:    int                 i;
        !            33: 
        !            34:    if (!path)
        !            35:       return FALSE;
        !            36: 
        !            37:    strcpy (temppath, path);
        !            38:    ExtractSuffix (temppath, suffix);
        !            39: 
        !            40:    /* Normalize the suffix */
        !            41:    i = 0;
        !            42:    while (suffix[i] != EOS)
        !            43:       nsuffix[i] = TOLOWER (suffix[i++]);
        !            44:    nsuffix[i] = EOS;
        !            45:    if ((strcmp (nsuffix, "html")) &&
        !            46:        (strcmp (nsuffix, "htm")) &&
        !            47:        (strcmp (nsuffix, "shtml")))
        !            48:       return FALSE;
        !            49:    return TRUE;
1.3       cvs        50: }
                     51: 
1.4       cvs        52: /*----------------------------------------------------------------------
                     53:    IsImageName                                                        
                     54:   ----------------------------------------------------------------------*/
1.3       cvs        55: 
                     56: #ifdef __STDC__
                     57: boolean             IsImageName (char *path)
                     58: #else  /* __STDC__ */
                     59: boolean             IsImageName (path)
                     60: char               *path;
                     61: 
                     62: #endif /* __STDC__ */
                     63: {
1.5     ! cvs        64:    char                temppath[MAX_LENGTH];
        !            65:    char                suffix[MAX_LENGTH];
        !            66:    char                nsuffix[MAX_LENGTH];
        !            67:    int                 i;
        !            68: 
        !            69:    if (!path)
        !            70:       return FALSE;
        !            71: 
        !            72:    strcpy (temppath, path);
        !            73:    ExtractSuffix (temppath, suffix);
        !            74: 
        !            75:    /* Normalize the suffix */
        !            76:    i = 0;
        !            77:    while (suffix[i] != EOS)
        !            78:       nsuffix[i] = TOLOWER (suffix[i++]);
        !            79:    nsuffix[i] = EOS;
        !            80:    if ((strcmp (nsuffix, "gif")) && (strcmp (nsuffix, "xbm")) &&
        !            81:        (strcmp (nsuffix, "xpm")) && (strcmp (nsuffix, "jpg")) &&
        !            82:        (strcmp (nsuffix, "png")) && (strcmp (nsuffix, "au")))
        !            83:       return FALSE;
        !            84:    return TRUE;
1.3       cvs        85: }
                     86: 
1.4       cvs        87: /*----------------------------------------------------------------------
                     88:    IsTextName                                                         
                     89:   ----------------------------------------------------------------------*/
1.3       cvs        90: 
                     91: #ifdef __STDC__
                     92: boolean             IsTextName (char *path)
                     93: #else  /* __STDC__ */
                     94: boolean             IsTextName (path)
                     95: char               *path;
                     96: 
                     97: #endif /* __STDC__ */
                     98: {
1.5     ! cvs        99:    char                temppath[MAX_LENGTH];
        !           100:    char                suffix[MAX_LENGTH];
        !           101:    char                nsuffix[MAX_LENGTH];
        !           102:    int                 i;
        !           103: 
        !           104:    if (!path)
        !           105:       return FALSE;
        !           106: 
        !           107:    strcpy (temppath, path);
        !           108:    ExtractSuffix (temppath, suffix);
        !           109: 
        !           110:    /* Normalize the suffix */
        !           111:    i = 0;
        !           112:    while (suffix[i] != EOS)
        !           113:      {
        !           114:        nsuffix[i] = TOLOWER (suffix[i]);
        !           115:        i++;
        !           116:      }
        !           117:    nsuffix[i] = EOS;
        !           118: 
        !           119:    if ((strcmp (nsuffix, "gif")) && (strcmp (nsuffix, "xbm")) &&
        !           120:        (strcmp (nsuffix, "xpm")) && (strcmp (nsuffix, "jpg")) &&
        !           121:        (strcmp (nsuffix, "pdf")) && (strcmp (nsuffix, "png")) &&
        !           122:        (strcmp (nsuffix, "Z")) && (strcmp (nsuffix, "gz")) &&
        !           123:        (strcmp (nsuffix, "tgz")) && (strcmp (nsuffix, "xpg")) &&
        !           124:        (strcmp (nsuffix, "xpd")) && (strcmp (nsuffix, "ps")) &&
        !           125:        (strcmp (nsuffix, "au")))
        !           126:       return TRUE;
        !           127:    return FALSE;
1.3       cvs       128: }
                    129: 
1.4       cvs       130: /*----------------------------------------------------------------------
                    131:    IsHTTPPath                                                         
                    132:   ----------------------------------------------------------------------*/
1.3       cvs       133: 
                    134: #ifdef __STDC__
                    135: boolean             IsHTTPPath (char *path)
                    136: #else  /* __STDC__ */
                    137: boolean             IsHTTPPath (path)
                    138: char               *path;
                    139: 
                    140: #endif /* __STDC__ */
                    141: {
1.5     ! cvs       142:    if (!path)
        !           143:       return FALSE;
1.3       cvs       144: 
1.5     ! cvs       145:    if (strncmp (path, "http:", 5) != 0)
        !           146:       return FALSE;
        !           147:    return TRUE;
1.3       cvs       148: }
                    149: 
1.4       cvs       150: /*----------------------------------------------------------------------
                    151:    IsWithParameters                                                   
                    152:   ----------------------------------------------------------------------*/
1.3       cvs       153: 
                    154: #ifdef __STDC__
                    155: boolean             IsWithParameters (char *path)
                    156: #else  /* __STDC__ */
                    157: boolean             IsWithParameters (path)
                    158: char               *path;
                    159: 
                    160: #endif /* __STDC__ */
                    161: {
1.5     ! cvs       162:    int                 i;
1.3       cvs       163: 
1.5     ! cvs       164:    if ((!path) || (path[0] == EOS))
        !           165:       return FALSE;
1.3       cvs       166: 
1.5     ! cvs       167:    i = strlen (path) - 1;
        !           168:    while (i > 0 && path[i--] != '?')
        !           169:       if (i < 0)
        !           170:         return FALSE;
1.3       cvs       171: 
1.5     ! cvs       172:    /* There is a parameter */
        !           173:    return TRUE;
1.3       cvs       174: }
                    175: 
1.4       cvs       176: /*----------------------------------------------------------------------
                    177:    IsW3Path                                                           
                    178:   ----------------------------------------------------------------------*/
1.3       cvs       179: 
                    180: #ifdef __STDC__
                    181: boolean             IsW3Path (char *path)
                    182: #else  /* __STDC__ */
                    183: boolean             IsW3Path (path)
                    184: char               *path;
                    185: 
                    186: #endif /* __STDC__ */
                    187: {
1.5     ! cvs       188:    if ((strncmp (path, "http:", 5)) && (strncmp (path, "ftp:", 4)) &&
        !           189:        (strncmp (path, "telnet:", 7)) && (strncmp (path, "wais:", 5)) &&
        !           190:        (strncmp (path, "news:", 5)) && (strncmp (path, "gopher:", 7)) &&
        !           191:        (strncmp (path, "mailto:", 7)) && (strncmp (path, "archie:", 7)))
        !           192:       return FALSE;
        !           193:    return TRUE;
1.3       cvs       194: }
                    195: 
1.4       cvs       196: /*----------------------------------------------------------------------
                    197:    IsValidProtocol                                                    
                    198:   ----------------------------------------------------------------------*/
1.3       cvs       199: 
                    200: #ifdef __STDC__
                    201: boolean             IsValidProtocol (char *path)
                    202: #else  /* __STDC__ */
                    203: boolean             IsValidProtocol (path)
                    204: char               *path;
                    205: 
                    206: #endif /* __STDC__ */
                    207: {
1.5     ! cvs       208:    if (!strncmp (path, "http:", 5)
1.3       cvs       209:       /***|| !strncmp (path, "ftp:", 4)
1.5     ! cvs       210:       || !strncmp (path, "news:", 5)***/ )
        !           211:       return (YES);
        !           212:    else
        !           213:       return (NO);
1.3       cvs       214: }
                    215: 
1.4       cvs       216: /*----------------------------------------------------------------------
                    217:    IsValidNormalizeURL  says which URL's may be normalized            
                    218:   ----------------------------------------------------------------------*/
1.3       cvs       219: 
                    220: #ifdef __STDC__
                    221: boolean             IsValidNormalizeURL (char *path)
                    222: #else  /* __STDC__ */
                    223: boolean             IsValidNormalizeURL (path)
                    224: char               *path;
                    225: 
                    226: #endif /* __STDC__ */
                    227: {
1.5     ! cvs       228:    if (strchr (path, ':') && !strncmp (path, "http:", 5))
        !           229:       return (YES);
        !           230:    else
        !           231:       return (NO);
1.3       cvs       232: }
                    233: 
                    234: 
1.4       cvs       235: /*----------------------------------------------------------------------
                    236:    NormalizeURL provides the new complete and normalized URL or file  
                    237:    name path and the name of the document.                 
                    238:    orgName is the original requested name.                 
                    239:    doc identifies the document which provides the original 
                    240:    name.                                                   
                    241:    newName is the resulting URL of file name.              
                    242:    docName is the resulting document name.                 
                    243:   ----------------------------------------------------------------------*/
1.3       cvs       244: 
                    245: #ifdef __STDC__
                    246: void                NormalizeURL (char *orgName, Document doc, char *newName, char *docName)
                    247: #else  /* __STDC__ */
                    248: void                NormalizeURL (orgName, doc, newName, docName)
                    249: char               *orgName;
                    250: Document            doc;
                    251: char               *newName;
                    252: char               *docName;
                    253: 
                    254: #endif /* __STDC__ */
                    255: {
1.5     ! cvs       256:    char                basename[MAX_LENGTH];
        !           257:    char                tempname[MAX_LENGTH];
        !           258:    int                 i;
        !           259:    char               *ptr;
        !           260:    char               *basename_ptr;
        !           261:    int                 basename_flag;
        !           262:    Element             el;
        !           263:    ElementType         elType;
        !           264:    AttributeType       attrType;
        !           265:    Attribute           attrHREF;
        !           266:    int                 length;
        !           267: 
        !           268:    /* Fix up orgName, by erasing leading and trailing white space */
        !           269:    if (!newName || !docName)
        !           270:       return;
        !           271:    ptr = orgName;
        !           272:    while (*ptr == ' ' && *ptr++ != EOS) ;
        !           273:    strcpy (tempname, ptr);
        !           274:    ptr = strchr (tempname, ' ');
        !           275:    if (ptr)
        !           276:       *ptr = EOS;
        !           277: 
        !           278:    /* 
        !           279:       ** the following block to take into account the BASE element.
        !           280:       ** This is not very optimized, as this procedure is repeated for
        !           281:       ** each element which is retrieved. A better way would be to
        !           282:       ** move this higher up in the function call hierarchy.
        !           283:     */
        !           284:    if (IsValidNormalizeURL (tempname) && doc)
        !           285:      {
        !           286:        length = MAX_LENGTH;
        !           287:        /* get the root element    */
        !           288:        el = TtaGetMainRoot (doc);
        !           289: 
        !           290:        /* search the BASE element */
        !           291:        elType.ElSSchema = TtaGetDocumentSSchema (doc);
        !           292:        elType.ElTypeNum = HTML_EL_BASE;
        !           293:        el = TtaSearchTypedElement (elType, SearchInTree, el);
        !           294:        if (el)
        !           295:          {
        !           296:             /* 
        !           297:                ** The document has a BASE element 
        !           298:                ** Get the HREF attribute of the BASE Element 
1.3       cvs       299:              */
1.5     ! cvs       300:             attrType.AttrSSchema = elType.ElSSchema;
        !           301:             attrType.AttrTypeNum = HTML_ATTR_HREF_;
        !           302:             attrHREF = TtaGetAttribute (el, attrType);
        !           303:             if (attrHREF)
        !           304:               {
        !           305:                  /* 
        !           306:                     ** Use the base path of the document 
        !           307:                     ** To do: verify length of the buffer
        !           308:                     ** length > TtaGetTextAttributeLength (attrHREF) + strlen (orgName) 
        !           309:                   */
        !           310:                  TtaGiveTextAttributeValue (attrHREF, basename, &length);
        !           311: 
        !           312:                  /* 
        !           313:                     ** base and orgName have to be separated by a DIR_SEP 
        !           314:                   */
        !           315:                  if (basename[strlen (basename) - 1] != DIR_SEP && tempname[0] != DIR_SEP)
        !           316:                     strcat (basename, DIR_STR);
        !           317:               }
        !           318:          }
        !           319:        else
        !           320:           basename[0] = EOS;
        !           321:      }
        !           322:    else
        !           323:       basename[0] = EOS;
        !           324: 
        !           325:    if (basename[0] == EOS)
        !           326:      {
        !           327:        /* 
        !           328:           ** There is no BASE element in that document.
        !           329:           ** A temporary fix as TtaExtractName does not tolerate a name
        !           330:           ** ending in /. Here, we reinsert the slash, in order to
        !           331:           ** parse the name in the following two lines. A bit
        !           332:           ** redundant and has to be reviewed.  
        !           333:         */
        !           334:        if (DocumentURLs[(int) doc])
        !           335:          {
        !           336:             basename_ptr = HTParse (DocumentURLs[(int) doc], "", PARSE_ALL);
        !           337:             basename_flag = TRUE;
        !           338:          }
        !           339:        else
        !           340:          {
        !           341:             basename_ptr = "";
        !           342:             basename_flag = FALSE;
        !           343:          }
        !           344:      }
        !           345:    else
        !           346:      {
        !           347:        basename_ptr = HTParse (basename, "", PARSE_ALL);
        !           348:        basename_flag = TRUE;
        !           349:      }                         /* if-else tempname */
        !           350: 
        !           351:    ptr = HTParse (tempname, basename_ptr, PARSE_ALL);
        !           352:    if (basename_flag)
        !           353:       HT_FREE (basename_ptr);
        !           354:    if (ptr)
        !           355:      {
        !           356:        ptr = HTSimplify (&ptr);
        !           357:        strcpy (newName, ptr);
        !           358:        HT_FREE (ptr);
        !           359:      }
        !           360:    else
        !           361:       newName[0] = EOS;
        !           362: 
        !           363:    i = strlen (newName) - 1;
        !           364:    if (i > 0)
        !           365:      {
        !           366:        /* 
        !           367:           ** A temporary fix for an interfacing problem:
        !           368:           ** TtaExtractName does not tolerate url's finished on DIR_SEP
        !           369:         */
        !           370:        ptr = strrchr (newName, DIR_SEP);
        !           371:        if (ptr)
        !           372:           ptr++;
        !           373:        if (ptr && *ptr != EOS)
        !           374:           strcpy (docName, ptr);
        !           375:        else
        !           376:           /*
        !           377:              ** The docname was not comprised inside the URL, so let's 
        !           378:              ** assign a "noname.html" name :)
        !           379:            */
        !           380:           strcpy (docName, "noname.html");
        !           381: 
        !           382:        /* 
        !           383:           ** A temporary fix for an interfacing problem:
        !           384:           ** TtaExtractName does not tolerate url's finished on DIR_SEP
        !           385:         */
        !           386:        if (newName[i] == DIR_SEP)
        !           387:           newName[i] = EOS;
        !           388:      }
1.3       cvs       389: }
                    390: 
1.4       cvs       391: /*----------------------------------------------------------------------
                    392:    IsSameHost                                                         
                    393:   ----------------------------------------------------------------------*/
1.3       cvs       394: 
                    395: #ifdef __STDC__
                    396: boolean             IsSameHost (char *url1, char *url2)
                    397: #else  /* __STDC__ */
                    398: boolean             IsSameHost (url1, url2)
                    399: char               *path;
                    400: 
                    401: #endif /* __STDC__ */
                    402: {
1.5     ! cvs       403:    char               *basename_ptr1, *basename_ptr2;
        !           404:    boolean             result;
1.3       cvs       405: 
1.5     ! cvs       406:    basename_ptr1 = HTParse (url1, "", PARSE_ACCESS | PARSE_HOST | PARSE_PUNCTUATION);
        !           407:    basename_ptr2 = HTParse (url2, "", PARSE_ACCESS | PARSE_HOST | PARSE_PUNCTUATION);
1.3       cvs       408: 
1.5     ! cvs       409:    if (strcmp (basename_ptr1, basename_ptr2))
        !           410:       result = NO;
        !           411:    else
        !           412:       result = YES;
1.3       cvs       413: 
1.5     ! cvs       414:    HT_FREE (basename_ptr1);
        !           415:    HT_FREE (basename_ptr2);
1.3       cvs       416: 
1.5     ! cvs       417:    return (result);
1.3       cvs       418: }
                    419: 
                    420: 
1.4       cvs       421: /*----------------------------------------------------------------------
                    422:    AHTMakeRelativeURL                                                
                    423:   ----------------------------------------------------------------------*/
1.3       cvs       424: 
                    425: #ifdef __STDC__
1.5     ! cvs       426: char               *AHTMakeRelativeName (char *url, char *base_url)
1.3       cvs       427: #else  /* __STDC__ */
1.5     ! cvs       428: char               *AHTMakeRelativeName (url, base_url)
        !           429: char                url;
        !           430: char                base_url;
        !           431: 
1.3       cvs       432: #endif /* __STDC__ */
                    433: {
1.5     ! cvs       434:    char               *base_ptr, *url_ptr;
        !           435:    char               *result;
        !           436: 
        !           437:    /* verify if we are in the same host */
1.3       cvs       438: 
1.5     ! cvs       439:    base_ptr = HTParse (base_url, "", PARSE_ACCESS | PARSE_HOST | PARSE_PUNCTUATION);
        !           440:    url_ptr = HTParse (url, "", PARSE_ACCESS | PARSE_HOST | PARSE_PUNCTUATION);
1.3       cvs       441: 
1.5     ! cvs       442:    if (!strcmp (base_ptr, url_ptr))
        !           443:      {
        !           444:        HT_FREE (base_ptr);
        !           445:        HT_FREE (url_ptr);
1.3       cvs       446: 
1.5     ! cvs       447:        /* Normalize the URLs */
1.3       cvs       448: 
1.5     ! cvs       449:        base_ptr = HTParse (base_url, "", PARSE_ALL);
        !           450:        url_ptr = HTParse (url, "", PARSE_ALL);
1.3       cvs       451: 
1.5     ! cvs       452:        /* Use libwww to make relative name */
1.3       cvs       453: 
1.5     ! cvs       454:        result = HTRelative (url_ptr, base_ptr);
        !           455:        HT_FREE (base_ptr);
        !           456:        HT_FREE (url_ptr);
        !           457:      }
        !           458:    else
        !           459:       result = (char *) NULL;
1.3       cvs       460: 
1.5     ! cvs       461:    return (result);
1.3       cvs       462: }

Webmaster