Annotation of libwww/Library/src/HTIcons.c, revision 2.28

2.6       frystyk     1: /*                                                                    HTIcon.c
                      2: **     ICON MANAGEMENT
                      3: **
2.10      frystyk     4: **     (c) COPYRIGHT MIT 1995.
2.6       frystyk     5: **     Please first read the full copyright statement in the file COPYRIGH.
2.28    ! frystyk     6: **     @(#) $Id: HTIcons.c,v 2.27 1996/06/28 16:31:08 frystyk Exp $
2.1       frystyk     7: **
                      8: **     This module contains the functions for initializing, adding
                      9: **     and selecting the icon for local directory listings, FTP and Gopher.
                     10: **
                     11: **     History:
2.13      frystyk    12: **        Mar 94       Written by Ari Luotonen, luotonen@dxcern.cern.ch
2.27      frystyk    13: **                     Henrik Frystyk, frystyk@w3.org
2.1       frystyk    14: **
                     15: */
                     16: 
                     17: /* Library include files */
2.28    ! frystyk    18: #include "wwwsys.h"
2.27      frystyk    19: #include "WWWUtil.h"
                     20: #include "WWWCore.h"
2.1       frystyk    21: #include "HTIcons.h"                                    /* Implemented here */
2.5       duns       22: 
2.27      frystyk    23: struct _HTIconNode {
                     24:     char *     icon_url;
                     25:     char *     icon_alt;
                     26:     char *     type_templ;
                     27: };
                     28: 
2.1       frystyk    29: /* Globals */
2.15      frystyk    30: PRIVATE HTIconNode * icon_unknown = NULL;      /* Unknown file type */
                     31: PRIVATE HTIconNode * icon_blank = NULL;                /* Blank icon in heading */
                     32: PRIVATE HTIconNode * icon_parent = NULL;       /* Parent directory icon */
                     33: PRIVATE HTIconNode * icon_dir = NULL;          /* Directory icon */
2.1       frystyk    34: 
                     35: /* Type definitions and global variables etc. local to this module */
                     36: PRIVATE HTList * icons = NULL;
                     37: PRIVATE int alt_len = 0;                       /* Longest ALT text */
                     38: 
                     39: /* ------------------------------------------------------------------------- */
                     40: 
2.18      frystyk    41: PRIVATE void alt_resize (char * alt)
2.1       frystyk    42: {
                     43:     if (alt) {
                     44:        int len = strlen(alt);
                     45:        if (len > alt_len) alt_len = len;
                     46:     }
                     47: }
                     48: 
2.27      frystyk    49: PRIVATE BOOL match (char * templ,
                     50:                    const char * actual)
                     51: {
                     52:     static char * c1 = NULL;
                     53:     static char * c2 = NULL;
                     54:     char * slash1;
                     55:     char * slash2;
                     56: 
                     57:     StrAllocCopy(c1,templ);
                     58:     StrAllocCopy(c2,actual);
                     59: 
                     60:     slash1 = strchr(c1,'/');
                     61:     slash2 = strchr(c2,'/');
                     62: 
                     63:     if (slash1 && slash2) {
                     64:        *slash1++ = 0;
                     65:        *slash2++ = 0;
                     66:        return HTStrMatch(c1,c2) && HTStrMatch(slash1,slash2);
                     67:     }
                     68:     else if (!slash1 && !slash2)
                     69:        return HTStrMatch(c1,c2) ? YES : NO;
                     70:     else
                     71:        return NO;
                     72: }
                     73: 
2.1       frystyk    74: 
2.27      frystyk    75: PRIVATE char * prefixed (const char * name, const char * prefix)
2.1       frystyk    76: {
2.27      frystyk    77:     char * ret = NULL;
                     78:     if (name) {
                     79:        int len = prefix ? strlen(prefix) : 0;
                     80:        if ((ret = (char *) HT_MALLOC(len + strlen(name) + 2)) == NULL)
                     81:            HT_OUTOFMEM("prefixed");
                     82:        if (prefix) {
                     83:            strcpy(ret, prefix);
                     84:            if (*prefix && prefix[len-1] != '/') strcat(ret, "/");
                     85:            strcat(ret, name);
                     86:        } else
                     87:            strcpy(ret, name);
                     88:     }
                     89:     return ret;
                     90: }
                     91: 
                     92: PUBLIC char * HTIcon_url (HTIconNode * node)
                     93: {
                     94:     return node ? node->icon_url : NULL;
                     95: }
2.1       frystyk    96: 
2.27      frystyk    97: /*
                     98: **     Returned string must be freed by caller
                     99: */
                    100: PUBLIC char * HTIcon_alternative (HTIconNode * node, BOOL brackets)
                    101: {
                    102:     char * ret = NULL;
                    103:     if (node) {
                    104:        char * p = NULL;
                    105:        int len = node->icon_alt ? strlen(node->icon_alt) : 0;
                    106:        if ((p = ret = (char *) HT_MALLOC(alt_len + 3)) == NULL)
                    107:            HT_OUTOFMEM("HTIcon_alt_string");
2.1       frystyk   108:        *p++ = brackets ? '[' : ' ';
2.27      frystyk   109:        if (node->icon_alt) strcpy(p, node->icon_alt);
                    110:        p += len;
                    111:        while (len++ < alt_len) *p++=' ';
2.1       frystyk   112:        *p++ = brackets ? ']' : ' ';
2.27      frystyk   113:        *p = 0;
                    114:     }
2.1       frystyk   115:     return ret;
                    116: }
                    117: 
                    118: /*
                    119: **     HTAddIcon(url, alt, type_templ) adds icon:
                    120: **
                    121: **             <IMG SRC="url" ALT="[alt]">
                    122: **
                    123: **     for files for which content-type or content-encoding matches
                    124: **     type_templ.  If type_templ contains a slash, it is taken to be
                    125: **     a content-type template.  Otherwise, it is a content-encoding
                    126: **     template.
                    127: */
2.27      frystyk   128: PUBLIC BOOL HTIcon_add (const char * url, const char * prefix,
                    129:                        char * alt, char * type_templ)
2.1       frystyk   130: {
2.27      frystyk   131:     if (url && type_templ) {
                    132:        HTIconNode * node;
                    133:        if ((node = (HTIconNode *) HT_CALLOC(1,sizeof(HTIconNode))) == NULL)
                    134:            HT_OUTOFMEM("HTAddIcon");
                    135:        if (url) node->icon_url = prefixed(url, prefix);
                    136:        if (alt) StrAllocCopy(node->icon_alt, alt);
                    137:        if (type_templ) StrAllocCopy(node->type_templ, type_templ);
                    138:        if (!icons) icons = HTList_new();
                    139:        HTList_addObject(icons, (void *) node);
                    140:        alt_resize(alt);
                    141:        if (PROT_TRACE)
                    142:            HTTrace("AddIcon..... %s => SRC=\"%s\" ALT=\"%s\"\n",
                    143:                    type_templ,url, alt ? alt : "");
                    144:        return YES;
                    145:     }
                    146:     return NO;
2.1       frystyk   147: }
                    148: 
                    149: /*
2.27      frystyk   150: **     Add the icon used for files for which
2.1       frystyk   151: **     no other icon seems appropriate (unknown type).
                    152: */
2.27      frystyk   153: PUBLIC BOOL HTIcon_addUnknown (const char * url, const char * prefix,
                    154:                               char * alt)
2.1       frystyk   155: {
2.27      frystyk   156:     if ((icon_unknown = (HTIconNode *) HT_CALLOC(1,sizeof(HTIconNode)))==NULL)
2.21      frystyk   157:         HT_OUTOFMEM("HTAddUnknownIcon");
2.27      frystyk   158:     if (url) icon_unknown->icon_url = prefixed(url, prefix);
2.1       frystyk   159:     if (alt) StrAllocCopy(icon_unknown->icon_alt, alt);
                    160:     alt_resize(alt);
2.8       frystyk   161:     if (PROT_TRACE)
2.27      frystyk   162:        HTTrace("Icon add.... UNKNOWN => SRC=\"%s\" ALT=\"%s\"\n",url,
2.8       frystyk   163:                alt ? alt : "");
2.27      frystyk   164:     return YES;
2.1       frystyk   165: }
                    166: 
                    167: 
                    168: /*
2.27      frystyk   169: **     Add the blank icon used in the heading of the listing.
2.1       frystyk   170: */
2.27      frystyk   171: PUBLIC BOOL HTIcon_addBlank (const char * url, const char * prefix, char * alt)
2.1       frystyk   172: {
2.21      frystyk   173:     if ((icon_blank = (HTIconNode *) HT_CALLOC(1,sizeof(HTIconNode))) == NULL)
                    174:         HT_OUTOFMEM("HTAddBlankIcon");
2.27      frystyk   175:     if (url) icon_blank->icon_url = prefixed(url, prefix);
2.1       frystyk   176:     if (alt) StrAllocCopy(icon_blank->icon_alt, alt);
                    177:     alt_resize(alt);
2.8       frystyk   178:     if (PROT_TRACE)
2.27      frystyk   179:        HTTrace("Icon add.... BLANK => SRC=\"%s\" ALT=\"%s\"\n",url,
2.8       frystyk   180:                alt ? alt : "");
2.27      frystyk   181:     return YES;
2.1       frystyk   182: }
                    183: 
                    184: 
                    185: /*
2.27      frystyk   186: **     Add the parent directory icon.
2.1       frystyk   187: */
2.27      frystyk   188: PUBLIC BOOL HTIcon_addParent (const char * url, const char * prefix, char * alt)
2.1       frystyk   189: {
2.21      frystyk   190:     if ((icon_parent = (HTIconNode *) HT_CALLOC(1,sizeof(HTIconNode))) == NULL)
                    191:         HT_OUTOFMEM("HTAddBlankIcon");
2.27      frystyk   192:     if (url) icon_parent->icon_url = prefixed(url, prefix);
2.1       frystyk   193:     if (alt) StrAllocCopy(icon_parent->icon_alt, alt);
                    194:     alt_resize(alt);
2.8       frystyk   195:     if (PROT_TRACE)
2.27      frystyk   196:        HTTrace("Icon add.... PARENT => SRC=\"%s\" ALT=\"%s\"\n",url,
2.8       frystyk   197:                alt ? alt : "");
2.27      frystyk   198:     return YES;
2.1       frystyk   199: }
                    200: 
                    201: 
                    202: /*
2.27      frystyk   203: **     Add the directory icon.
2.1       frystyk   204: */
2.27      frystyk   205: PUBLIC BOOL HTIcon_addDir (const char * url, const char * prefix, char * alt)
2.1       frystyk   206: {
2.21      frystyk   207:     if ((icon_dir = (HTIconNode *) HT_CALLOC(1,sizeof(HTIconNode))) == NULL)
                    208:         HT_OUTOFMEM("HTAddBlankIcon");
2.27      frystyk   209:     if (url) icon_dir->icon_url = prefixed(url, prefix);
2.1       frystyk   210:     if (alt) StrAllocCopy(icon_dir->icon_alt, alt);
                    211:     alt_resize(alt);
2.8       frystyk   212:     if (PROT_TRACE)
2.27      frystyk   213:        HTTrace("Icon add.... DIRECTORY => SRC=\"%s\" ALT=\"%s\"\n",url,
2.8       frystyk   214:                alt ? alt : "");
2.27      frystyk   215:     return YES;
2.1       frystyk   216: }
                    217: 
2.27      frystyk   218: /*
                    219: **     Returns the icon corresponding to content_type or content_encoding.
                    220: **     If no match is found then use "unknown icon"
2.1       frystyk   221: */
2.27      frystyk   222: PUBLIC HTIconNode * HTIcon_find (HTFileMode    mode,
                    223:                                 HTFormat       content_type,
                    224:                                 HTEncoding     content_encoding)
2.1       frystyk   225: {
                    226:     if (!icon_unknown) icon_unknown = icon_blank;
2.15      frystyk   227:     if (mode == HT_IS_FILE) {
2.26      eric      228:        const char * ct = content_type ? HTAtom_name(content_type) : NULL;
                    229:        const char * ce = content_encoding ? HTAtom_name(content_encoding) : NULL;
2.1       frystyk   230:        HTList * cur = icons;
                    231:        HTIconNode * node;
                    232: 
                    233:        while ((node = (HTIconNode*)HTList_nextObject(cur))) {
                    234:            char * slash = strchr(node->type_templ,'/');
                    235:            if ((ct && slash && match(node->type_templ,ct)) ||
2.20      frystyk   236:                (ce && !slash && HTStrMatch(node->type_templ,ce))) {
2.1       frystyk   237:                return node;
                    238:            }
                    239:        }
2.15      frystyk   240:     } else if (mode == HT_IS_DIR) {
2.1       frystyk   241:        return icon_dir ? icon_dir : icon_unknown;
2.15      frystyk   242:     } else if (mode == HT_IS_BLANK) {
                    243:        return icon_blank ? icon_blank : icon_unknown;
                    244:     } else if (mode == HT_IS_PARENT) {
                    245:        return icon_parent ? icon_parent : icon_unknown;
2.1       frystyk   246:     }
                    247:     return icon_unknown;
2.2       luotonen  248: }

Webmaster