You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeaddons/tdefile-plugins/mhtml/tdefile_mhtml.cpp

202 lines
7.1 KiB

/***************************************************************************
* 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 <config.h>
#include "tdefile_mhtml.h"
#include <kgenericfactory.h>
#include <kmdcodec.h>
#include <tqstring.h>
#include <tqcstring.h>
#include <tqfile.h>
#include <tqtextstream.h>
#include <tqtextcodec.h>
typedef KGenericFactory<mhtmlPlugin> 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)<en){
st++;
continue;
}
dec=dec.left(st)+dec.mid(st+1,en-st-1)+dec.mid(en+1);
}else if(st!=-1) st++;
}
decodedText=dec;
}
}
return decodedText;
}
TQString mhtmlPlugin::decodeRFC2047String(const TQString &msg){
TQString charset;
TQString encoding;
TQString notEncodedText;
TQString encodedText;
TQString decodedText;
int encEnd=0;
if(msg.startsWith("=?") && (encEnd=msg.findRev("?="))!=-1){
notEncodedText=msg.mid(encEnd+2);
encodedText=msg.left(encEnd);
encodedText=encodedText.mid(2,encodedText.length()-2);
int questionMark=encodedText.find('?');
if(questionMark==-1) return msg;
charset=encodedText.left(questionMark).lower();
encoding=encodedText.mid(questionMark+1,1).lower();
if(encoding!="b" && encoding!="q") return msg;
encodedText=encodedText.mid(questionMark+3);
if(charset.find(" ")!=-1 && encodedText.find(" ")!=-1) return msg;
TQCString tmpIn;
TQCString tmpOut;
tmpIn = encodedText.local8Bit();
if(encoding=="q")tmpOut=KCodecs::quotedPrintableDecode(tmpIn);
else tmpOut=KCodecs::base64Decode(tmpIn);
if(charset!="us-ascii"){
TQTextCodec *codec = TQTextCodec::codecForName(charset.local8Bit());
if(!codec) return msg;
decodedText=codec->toUnicode(tmpOut);
decodedText=decodedText.replace("_"," ");
}else decodedText=tmpOut.replace("_"," ");
return decodedText + notEncodedText;
}else return msg;
}
#include "tdefile_mhtml.moc"