00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #include "libts.h"        
00025 
00026 MimeTableEntry
00027   MimeTable::m_table[] = {
00028   {"ai", "application/postscript", "8bit", "text"},
00029   {"aif", "audio/x-aiff", "binary", "sound"},
00030   {"aifc", "audio/x-aiff", "binary", "sound"},
00031   {"aiff", "audio/x-aiff", "binary", "sound"},
00032   {"arj", "application/x-arj-compressed", "binary", "binary"},
00033   {"au", "audio/basic", "binary", "sound"},
00034   {"avi", "video/x-msvideo", "binary", "movie"},
00035   {"bcpio", "application/x-bcpio", "binary", "binary"},
00036   {"bin", "application/macbinary", "macbinary", "binary"},
00037   {"c", "text/plain", "7bit", "text"},
00038   {"cc", "text/plain", "7bit", "text"},
00039   {"cdf", "application/x-netcdf", "binary", "binary"},
00040   {"cpio", "application/x-cpio", "binary", "binary"},
00041   {"csh", "application/x-csh", "7bit", "text"},
00042   {"doc", "application/msword", "binary", "binary"},
00043   {"dvi", "application/x-dvi", "binary", "binary"},
00044   {"eps", "application/postscript", "8bit", "text"},
00045   {"etx", "text/x-setext", "7bit", "text"},
00046   {"exe", "application/octet-stream", "binary", "binary"},
00047   {"f90", "text/plain", "7bit", "text"},
00048   {"gif", "image/gif", "binary", "image"},
00049   {"gtar", "application/x-gtar", "binary", "binary"},
00050   {"gz", "application/x-gzip", "x-gzip", "binary"},
00051   {"h", "text/plain", "7bit", "text"},
00052   {"hdf", "application/x-hdf", "binary", "binary"},
00053   {"hh", "text/plain", "7bit", "text"},
00054   {"hqx", "application/mac-binhex40", "mac-binhex40", "binary"},
00055   {"htm", "text/html", "8bit", "text"},
00056   {"html", "text/html", "8bit", "text"},
00057   {"ief", "image/ief", "binary", "image"},
00058   {"jpe", "image/jpeg", "binary", "image"},
00059   {"jpeg", "image/jpeg", "binary", "image"},
00060   {"jpg", "image/jpeg", "binary", "image"},
00061   {"latex", "application/x-latex", "8bit", "text"},
00062   {"lha", "application/x-lha-compressed", "binary", "binary"},
00063   {"lsm", "text/plain", "7bit", "text"},
00064   {"lzh", "application/x-lha-compressed", "binary", "binary"},
00065   {"m", "text/plain", "7bit", "text"},
00066   {"man", "application/x-troff-man", "7bit", "text"},
00067   {"me", "application/x-troff-me", "7bit", "text"},
00068   {"mif", "application/x-mif", "binary", "binary"},
00069   {"mime", "www/mime", "8bit", "text"},
00070   {"mov", "video/quicktime", "binary", "movie"},
00071   {"movie", "video/x-sgi-movie", "binary", "movie"},
00072   {"mp2", "audio/mpeg", "binary", "sound"},
00073   {"mp3", "audio/mpeg", "binary", "sound"},
00074   {"mpe", "video/mpeg", "binary", "movie"},
00075   {"mpeg", "video/mpeg", "binary", "movie"},
00076   {"mpg", "video/mpeg", "binary", "movie"},
00077   {"ms", "application/x-troff-ms", "7bit", "text"},
00078   {"msw", "application/msword", "binary", "binary"},
00079   {"mwrt", "application/macwriteii", "binary", "binary"},
00080   {"nc", "application/x-netcdf", "binary", "binary"},
00081   {"oda", "application/oda", "binary", "binary"},
00082   {"pbm", "image/x-portable-bitmap", "binary", "image"},
00083   {"pdf", "application/pdf", "binary", "binary"},
00084   {"pgm", "image/x-portable-graymap", "binary", "image"},
00085   {"pic", "application/pict", "binary", "image"},
00086   {"pict", "application/pict", "binary", "image"},
00087   {"pnm", "image/x-portable-anymap", "binary", "image"},
00088   {"ppm", "image/x-portable-pixmap", "binary", "image"},
00089   {"ps", "application/postscript", "8bit", "text"},
00090   {"qt", "video/quicktime", "binary", "movie"},
00091   {"ras", "image/cmu-raster", "binary", "image"},
00092   {"rgb", "image/x-rgb", "binary", "image"},
00093   {"roff", "application/x-troff", "7bit", "text"},
00094   {"rpm", "application/x-rpm", "binary", "binary"},
00095   {"rtf", "application/x-rtf", "7bit", "binary"},
00096   {"rtx", "text/richtext", "7bit", "text"},
00097   {"sh", "application/x-sh", "7bit", "text"},
00098   {"shar", "application/x-shar", "8bit", "text"},
00099   {"sit", "application/stuffit", "binary", "binary"},
00100   {"snd", "audio/basic", "binary", "sound"},
00101   {"src", "application/x-wais-source", "7bit", "text"},
00102   {"sv4cpio", "application/x-sv4cpio", "binary", "binary"},
00103   {"sv4crc", "application/x-sv4crc", "binary", "binary"},
00104   {"t", "application/x-troff", "7bit", "text"},
00105   {"tar", "application/x-tar", "binary", "binary"},
00106   {"tcl", "application/x-tcl", "7bit", "text"},
00107   {"tex", "application/x-tex", "8bit", "text"},
00108   {"texi", "application/x-texinfo", "7bit", "text"},
00109   {"texinfo", "application/x-texinfo", "7bit", "text"},
00110   {"tgz", "application/x-tar", "x-gzip", "binary"},
00111   {"tif", "image/tiff", "binary", "image"},
00112   {"tiff", "image/tiff", "binary", "image"},
00113   {"tr", "application/x-troff", "7bit", "text"},
00114   {"tsv", "text/tab-separated-values", "7bit", "text"},
00115   {"txt", "text/plain", "7bit", "text"},
00116   {"ustar", "application/x-ustar", "binary", "binary"},
00117   {"wav", "audio/x-wav", "binary", "sound"},
00118   {"xbm", "image/x-xbitmap", "binary", "image"},
00119   {"xpm", "image/x-xpixmap", "binary", "image"},
00120   {"xwd", "image/x-xwindowdump", "binary", "image"},
00121   {"Z", "application/x-compressed", "x-compress", "binary"},
00122   {"zip", "application/x-zip-compressed", "zip", "binary"}
00123 };
00124 int
00125   MimeTable::m_table_size = (sizeof(MimeTable::m_table)) / (sizeof(MimeTable::m_table[0]));
00126 MimeTableEntry
00127 MimeTable::m_unknown = { "unknown", "application/x-unknown-content-type", "binary", "unknown" };
00128 MimeTable
00129   mimeTable;
00130 
00131 
00132 
00133 
00134 
00135 
00136 
00137 
00138 
00139 
00140 MimeTableEntry *
00141 MimeTable::get_entry_path(const char *path)
00142 {
00143   const char *p = strrchr(path, '.');
00144   MimeTableEntry *e = 0;
00145 
00146   if (p)
00147     e = get_entry(p + 1);
00148   else {
00149 
00150     
00151     
00152 
00153     if (ParseRules::strcasestr(path, "index") ||
00154         ParseRules::strcasestr(path, "README") ||
00155         ParseRules::strcasestr(path, "ls-lR") ||
00156         ParseRules::strcasestr(path, "config") || (path[0] == '\0') || (path[strlen(path) - 1] == '/'))
00157       e = get_entry("txt");
00158   }
00159   if (e == 0)
00160     e = &m_unknown;
00161 
00162   return (e);
00163 }
00164 
00165 
00166 
00167 
00168 
00169 
00170 MimeTableEntry *
00171 MimeTable::get_entry(const char *name)
00172 {
00173   MimeTableEntry key;
00174 
00175   key.name = name;
00176 
00177   
00178   int low = 0;
00179   int high = m_table_size - 1;
00180   int mid = ((high - low) / 2) + low;
00181   int found = -1;
00182 
00183   if (!name[0])
00184     return (0);
00185 
00186 
00187   while (1) {
00188     if (m_table[mid] == key) {
00189       found = mid;
00190       break;
00191     } else if (m_table[mid] < key) {
00192       if (mid == high) {
00193         found = -1;
00194         break;
00195       } else {
00196         low = mid + 1;
00197         mid = ((high - low) / 2) + low;
00198       }
00199     } else {
00200       if (mid == low) {
00201         found = -1;
00202         break;
00203       } else {
00204         high = mid - 1;
00205         mid = ((high - low) / 2) + low;
00206       }
00207     }
00208   }
00209 
00210   return ((found >= 0) ? (&m_table[found]) : 0);
00211 }