--------------------- PatchSet 5271 Date: 2002/10/07 08:27:55 Author: rbcollins Branch: rbcollins_cxxtest Tag: (none) Log: async storegetpublic for loading icons Members: src/mime.cc:1.1.2.2->1.1.2.3 Index: squid/src/mime.cc =================================================================== RCS file: /cvsroot/squid-sf//squid/src/Attic/mime.cc,v retrieving revision 1.1.2.2 retrieving revision 1.1.2.3 diff -u -r1.1.2.2 -r1.1.2.3 --- squid/src/mime.cc 7 Oct 2002 07:19:13 -0000 1.1.2.2 +++ squid/src/mime.cc 7 Oct 2002 08:27:55 -0000 1.1.2.3 @@ -1,6 +1,6 @@ /* - * $Id: mime.cc,v 1.1.2.2 2002/10/07 07:19:13 rbcollins Exp $ + * $Id: mime.cc,v 1.1.2.3 2002/10/07 08:27:55 rbcollins Exp $ * * DEBUG: section 25 MIME Parsing * AUTHOR: Harvest Derived @@ -39,17 +39,24 @@ #define GET_HDR_SZ 1024 -class MimeIcon { +class MimeIcon : public StoreClient { public: MimeIcon (); void setName (char const *); char const * getName () const; void _free(); + void load(); + void created (_StoreEntry *newEntry); private: char *icon; + char *url; }; -typedef struct _mime_entry { +class mimeEntry { +public: + void *operator new (unsigned int byteCount); + void operator delete (void *address); + char *pattern; regex_t compiled_pattern; char *icon; @@ -57,14 +64,24 @@ char *content_encoding; char transfer_mode; unsigned int view_option:1, download_option:1; - struct _mime_entry *next; + mimeEntry *next; MimeIcon theIcon; -} mimeEntry; +}; static mimeEntry *MimeTable = NULL; static mimeEntry **MimeTableTail = &MimeTable; -static void mimeLoadIconFile(const char *icon); +void * +mimeEntry::operator new (unsigned int byteCount) +{ + return xcalloc(1, byteCount); +} + +void +mimeEntry::operator delete (void *address) +{ + safe_free (address); +} /* returns a pointer to a field-value of the first matching field-name */ char * @@ -218,7 +235,7 @@ return m; } -MimeIcon::MimeIcon () : icon (NULL) +MimeIcon::MimeIcon () : icon (NULL), url (NULL) { } @@ -226,7 +243,9 @@ MimeIcon::setName (char const *aString) { safe_free (icon); + safe_free (url); icon = xstrdup (aString); + url = xstrdup (internalLocalUri("/squid-internal-static/icons/", icon)); } char const * @@ -239,6 +258,7 @@ MimeIcon::_free() { safe_free (icon); + safe_free (url); } @@ -382,7 +402,7 @@ debug(25, 1) ("mimeInit: regcomp error: '%s'\n", buf); continue; } - m = static_cast(xcalloc(1, sizeof(mimeEntry))); + m = new mimeEntry; m->pattern = xstrdup(pattern); m->content_type = xstrdup(type); m->theIcon.setName(icon); @@ -405,7 +425,7 @@ * Create Icon StoreEntry's */ for (m = MimeTable; m != NULL; m = m->next) - mimeLoadIconFile(m->theIcon.getName()); + m->theIcon.load(); debug(25, 1) ("Loaded Icons.\n"); } @@ -420,31 +440,36 @@ safe_free(m->icon); safe_free(m->content_encoding); regfree(&m->compiled_pattern); - safe_free(m); + delete m; } MimeTableTail = &MimeTable; } -static void -mimeLoadIconFile(const char *icon) +void +MimeIcon::load() +{ + const char *type = mimeGetContentType(icon); + if (type == NULL) + fatal("Unknown icon format while reading mime.conf\n"); + _StoreEntry::getPublic(this, url, METHOD_GET); +} + +void +MimeIcon::created (StoreEntry *newEntry) { + /* is already in the store, do nothing */ + if (!newEntry->isNull()) + return; int fd; int n; request_flags flags; struct stat sb; - StoreEntry *e; LOCAL_ARRAY(char, path, MAXPATHLEN); - LOCAL_ARRAY(char, url, MAX_URL); char *buf; - const char *type = mimeGetContentType(icon); HttpReply *reply; http_version_t version; - if (type == NULL) - fatal("Unknown icon format while reading mime.conf\n"); - buf = internalLocalUri("/squid-internal-static/icons/", icon); - xstrncpy(url, buf, MAX_URL); - if (storeGetPublic(url, METHOD_GET)) - return; + + snprintf(path, MAXPATHLEN, "%s/%s", Config.icons.directory, icon); fd = file_open(path, O_RDONLY | O_BINARY); if (fd < 0) { @@ -458,7 +483,7 @@ } flags = null_request_flags; flags.cachable = 1; - e = storeCreateEntry(url, + StoreEntry *e = storeCreateEntry(url, url, flags, METHOD_GET); @@ -470,7 +495,7 @@ httpReplyReset(reply = e->mem_obj->reply); httpBuildVersion(&version, 1, 0); httpReplySetHeaders(reply, version, HTTP_OK, NULL, - type, (int) sb.st_size, sb.st_mtime, -1); + mimeGetContentType(icon), (int) sb.st_size, sb.st_mtime, -1); reply->cache_control = httpHdrCcCreate(); httpHdrCcSetMaxAge(reply->cache_control, 86400); httpHeaderPutCc(&reply->header, reply->cache_control);