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
|