/*************************************************************************** * Copyright (C) 2005 by Spiros Georgaras * * sngeorgaras@otenet.gr * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include #include "tdefile_mhtml.h" #include #include #include #include #include #include #include typedef KGenericFactory mhtmlFactory; K_EXPORT_COMPONENT_FACTORY(tdefile_mhtml, mhtmlFactory( "tdefile_mhtml" )) mhtmlPlugin::mhtmlPlugin(TQObject *parent, const char *name, const TQStringList &args) : KFilePlugin(parent, name, args) { KFileMimeTypeInfo* info = addMimeTypeInfo( "application/x-mimearchive" ); KFileMimeTypeInfo::GroupInfo* group = 0L; group = addGroupInfo(info, "mhtmlInfo", i18n("Document Information")); KFileMimeTypeInfo::ItemInfo* item; item = addItemInfo(group, "Subject", i18n("Subject"), TQVariant::String); item = addItemInfo(group, "Sender", i18n("Sender"), TQVariant::String); item = addItemInfo(group, "Recipient", i18n("Recipient"), TQVariant::String); item = addItemInfo(group, "CopyTo", i18n("CC"), TQVariant::String); item = addItemInfo(group, "BlindCopyTo", i18n("BCC"), TQVariant::String); item = addItemInfo(group, "Date", i18n("Date"), TQVariant::String); } bool mhtmlPlugin::readInfo( KFileMetaInfo& info, uint /*what*/) { TQString mSender; TQString mRecipient; TQString mCopyTo; TQString mBlindCopyTo; TQString mSubject; TQString mDate; bool canUnfold; if ( info.path().isEmpty() ) // remote file return false; TQFile f(info.path()); if (!f.open(IO_ReadOnly)) return false; TQTextStream stream(&f); TQString l=stream.readLine(); int nFieldsFound = 0; while(!l.isEmpty()){ if(l.startsWith("From: ")) { mSender=l.mid(6); nFieldsFound |= 1; canUnfold=TRUE; } else if(l.startsWith("To: ")) { mRecipient=l.mid(4); nFieldsFound |= 2; canUnfold=TRUE; } else if(l.startsWith("Subject: ")) { mSubject=l.mid(9); nFieldsFound |= 4; canUnfold=TRUE; } else if(l.startsWith("Cc: ")) { mCopyTo=l.mid(4); nFieldsFound |= 8; canUnfold=TRUE; } else if(l.startsWith("Bcc: ")) { mBlindCopyTo=l.mid(5); nFieldsFound |= 16; canUnfold=TRUE; } else if(l.startsWith("Date: ")) { mDate=l.mid(6); nFieldsFound |= 32; canUnfold=FALSE; }else if(l.startsWith(" ") || l.startsWith("\t")){ // unfold field if(canUnfold){ TQString tmp=l.stripWhiteSpace(); if(nFieldsFound & 16) mBlindCopyTo=mBlindCopyTo+" "+tmp; else if(nFieldsFound & 8) mCopyTo=mCopyTo+" "+tmp; else if(nFieldsFound & 4) mSubject=mSubject+" "+tmp; else if(nFieldsFound & 2) mRecipient=mRecipient+" "+tmp; else if(nFieldsFound & 1) mSender=mSender+" "+tmp; } }else canUnfold=FALSE; // break out of the loop once the six fields have been found if ( nFieldsFound == 32+16+8+4+2+1 ) break; l=stream.readLine(); } f.close(); KFileMetaInfoGroup group = appendGroup(info, "mhtmlInfo"); appendItem(group, "Subject", decodeRFC2047Phrase(mSubject,FALSE)); appendItem(group, "Sender", decodeRFC2047Phrase(mSender)); appendItem(group, "Recipient", decodeRFC2047Phrase(mRecipient)); appendItem(group, "CopyTo", decodeRFC2047Phrase(mCopyTo)); appendItem(group, "BlindCopyTo", decodeRFC2047Phrase(mBlindCopyTo)); appendItem(group, "Date", mDate); return true; } TQString mhtmlPlugin::decodeRFC2047Phrase(const TQString &msg, bool removeLessGreater){ int st=msg.find("=?"); int en=-1; TQString msgCopy=msg; TQString decodedText=msgCopy.left(st); TQString encodedText=msgCopy.mid(st); st=encodedText.find("=?"); while(st!=-1){ en=encodedText.find("?="); while(encodedText.mid(en+2,1)!=" " && en+2<(int)encodedText.length()) en=encodedText.find("?=",en+1); if(en==-1) break; decodedText+=encodedText.left(st); TQString tmp=encodedText.mid(st,en-st+2); encodedText=encodedText.mid(en+2); decodedText+=decodeRFC2047String(tmp); st=encodedText.find("=?",st+1); } decodedText += encodedText; // remove unwanted '<' and '>' if(removeLessGreater){ if(decodedText.stripWhiteSpace().startsWith("<") && decodedText.stripWhiteSpace().endsWith(">")){ TQString tmp=decodedText.stripWhiteSpace(); tmp=tmp.mid(1,tmp.length()-2); decodedText=tmp; }else{ TQString dec=decodedText; TQString tmp; st=decodedText.find("<"); while(st!=-1){ st=dec.find("<",st); if(st==0 || (st!=0 && (dec.mid(st-2,2)==", "))){ en=dec.find(">",st); if(en==-1 && dec.find(",",st)toUnicode(tmpOut); decodedText=decodedText.replace("_"," "); }else decodedText=tmpOut.replace("_"," "); return decodedText + notEncodedText; }else return msg; } #include "tdefile_mhtml.moc"