From: stephan b. <sg...@us...> - 2004-12-24 16:23:35
|
Update of /cvsroot/pclasses/pclasses2/src/System In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31114/src/System Modified Files: Mime.cpp Log Message: added readDatabase(istream) and writeDatabase(ostream). Index: Mime.cpp =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/System/Mime.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- Mime.cpp 24 Dec 2004 15:13:35 -0000 1.6 +++ Mime.cpp 24 Dec 2004 16:23:24 -0000 1.7 @@ -166,6 +166,7 @@ bool MimeTypeDb::add(const MimeType& mtype) { + if( mtype.mimeType().empty() ) return false; if( this->typeMap().end() != this->typeMap().find( mtype.mimeType() ) ) { return false; @@ -208,17 +209,43 @@ return pf.find( "mime" ); } +/** + Internal helper: loads system-wide mime.types file for + MimeTypeDb::instance(). +*/ size_t readSystemMimeTypes( const std::string & dbfile, MimeTypeDb & db ) { - size_t count = 0; - if( dbfile.empty() ) { CERR << "WARNING: Could not find mime.types database!\n"; - return count; + return 0; } // CERR << "Mime db file=["<<dbfile<<"]\n"; std::ifstream strm(dbfile.c_str()); + if( ! strm.good() ) return 0; + + size_t count = 0; + { // i'm such an asshole ;) + MimeType s11n("application/x-s11n"); + db.add( s11n ); + db.mapExtension( s11n, "s11n" ); + ++count; + } + + return count + db.readDatabase( strm ); +} + +void +MimeTypeDb::clear() +{ + this->m_types.clear(); + this->m_exts.clear(); + this->m_rexts.clear(); +} + +size_t +MimeTypeDb::readDatabase( std::istream & strm ) +{ std::string line; std::string::size_type pos; std::string ext; @@ -226,6 +253,7 @@ std::string strMediaType; std::string strSubType; MimeType mimet; + size_t count = 0; while(!strm.eof()) { getline(strm, line); @@ -246,7 +274,7 @@ : line.substr(pos+1,(line.size()-pos)); ///CERR << "media=["<<strMediaType<<"]\t subtype=["<<strSubType<<"]\t" << "rest=["<<rest<<"]\n"; mimet = MimeType(strMediaType, strSubType); - db.add(mimet); + this->add(mimet); ++count; if( rest.empty() ) { @@ -260,14 +288,44 @@ if( ! ext.empty() && ext[0] != '#' ) { ++pos; - db.mapExtension( mimet, ext ); + this->mapExtension( mimet, ext ); } ext = ""; } //CERR << "Mapped "<<pos<<" file extensions for "<<strMediaType<<"/" << strSubType<<"\n"; } return count; - + +} + +void +MimeTypeDb::writeDatabase( std::ostream & os ) +{ + os << "# mime.types db written by MimeTypeDb\n"; + + + const MimeTypeMap & mimes = this->typeMap(); + const MimeToFilesMap & m2f = this->mimeToFilesMap(); + MimeTypeMap::const_iterator it = mimes.begin(), + et = mimes.end(); + MimeToFilesMap::const_iterator fit, fet; + MimeType mimet; + for( ; et != it; it++ ) + { + mimet = (*it).second; + os << mimet.mimeType(); + fit = m2f.lower_bound( mimet ); + fet = m2f.upper_bound( mimet ); + if( fet != fit ) + { + os << "\t\t\t"; + for( ; fet != fit; fit++ ) + { + os << " " << (*fit).second; + } + } + os << "\n"; + } } void |