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