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.
202 lines
7.1 KiB
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"
|
|
|