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

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.27    ! frystyk     6: **     @(#) $Id: HTIcons.c,v 2.26 1996/06/03 19:25:17 eric 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.23      frystyk    18: #include "sysdep.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