mailinglist-magic.cpp
00001 #ifdef HAVE_CONFIG_H
00002 #include <config.h>
00003 #endif
00004
00005 #include "kmmessage.h"
00006 #include "mailinglist-magic.h"
00007
00008 typedef QString (*MagicDetectorFunc) (const KMMessage *, QCString &, QString &);
00009
00010
00011 static QString check_sender(const KMMessage *message,
00012 QCString &header_name,
00013 QString &header_value )
00014 {
00015 QString header = message->headerField( "Sender" );
00016
00017 if ( header.isEmpty() )
00018 return QString::null;
00019
00020 if ( header.left( 6 ) == "owner-" )
00021 {
00022 header_name = "Sender";
00023 header_value = header;
00024 header = header.mid( 6, header.find( '@' ) - 6 );
00025
00026 } else {
00027 int index = header.find( "-owner@ " );
00028 if ( index == -1 )
00029 return QString::null;
00030
00031 header.truncate( index );
00032 header_name = "Sender";
00033 header_value = header;
00034 }
00035
00036 return header;
00037 }
00038
00039
00040 static QString check_x_beenthere(const KMMessage *message,
00041 QCString &header_name,
00042 QString &header_value )
00043 {
00044 QString header = message->headerField( "X-BeenThere" );
00045 if ( header.isNull() || header.find( '@' ) == -1 )
00046 return QString::null;
00047
00048 header_name = "X-BeenThere";
00049 header_value = header;
00050 header.truncate( header.find( '@' ) );
00051 return header;
00052 }
00053
00054
00055 static QString check_delivered_to(const KMMessage *message,
00056 QCString &header_name,
00057 QString &header_value )
00058 {
00059 QString header = message->headerField( "Delivered-To" );
00060 if ( header.isNull() || header.left(13 ) != "mailing list"
00061 || header.find( '@' ) == -1 )
00062 return QString::null;
00063
00064 header_name = "Delivered-To";
00065 header_value = header;
00066
00067 return header.mid( 13, header.find( '@' ) - 13 );
00068 }
00069
00070
00071 static QString check_x_mailing_list(const KMMessage *message,
00072 QCString &header_name,
00073 QString &header_value )
00074 {
00075 QString header = message->headerField( "X-Mailing-List");
00076 if ( header.isEmpty() )
00077 return QString::null;
00078
00079 if ( header.find( '@' ) < 1 )
00080 return QString::null;
00081
00082 header_name = "X-Mailing-List";
00083 header_value = header;
00084 if ( header[0] == '<' )
00085 header = header.mid(1, header.find( '@' ) - 1);
00086 else
00087 header.truncate( header.find( '@' ) );
00088 return header;
00089 }
00090
00091
00092 static QString check_list_id(const KMMessage *message,
00093 QCString &header_name,
00094 QString &header_value )
00095 {
00096 int lAnglePos, firstDotPos;
00097 QString header = message->headerField( "List-Id" );
00098 if ( header.isEmpty() )
00099 return QString::null;
00100
00101 lAnglePos = header.find( '<' );
00102 if ( lAnglePos < 0 )
00103 return QString::null;
00104
00105 firstDotPos = header.find( '.', lAnglePos );
00106 if ( firstDotPos < 0 )
00107 return QString::null;
00108
00109 header_name = "List-Id";
00110 header_value = header.mid( lAnglePos );
00111 header = header.mid( lAnglePos + 1, firstDotPos - lAnglePos - 1 );
00112 return header;
00113 }
00114
00115
00116
00117 static QString check_list_post(const KMMessage *message,
00118 QCString &header_name,
00119 QString &header_value )
00120 {
00121 QString header = message->headerField( "List-Post" );
00122 if ( header.isEmpty() )
00123 return QString::null;
00124
00125 int lAnglePos = header.find( "<mailto:" );
00126 if ( lAnglePos < 0 )
00127 return QString::null;
00128
00129 header_name = "List-Post";
00130 header_value = header;
00131 header = header.mid( lAnglePos + 8, header.length());
00132 header.truncate( header.find('@') );
00133 return header;
00134 }
00135
00136
00137 static QString check_mailing_list(const KMMessage *message,
00138 QCString &header_name,
00139 QString &header_value )
00140 {
00141 QString header = message->headerField( "Mailing-List");
00142 if ( header.isEmpty() )
00143 return QString::null;
00144
00145 if (header.left( 5 ) != "list " || header.find( '@' ) < 5 )
00146 return QString::null;
00147
00148 header_name = "Mailing-List";
00149 header_value = header;
00150 header = header.mid(5, header.find( '@' ) - 5);
00151 return header;
00152 }
00153
00154
00155
00156 static QString check_x_loop(const KMMessage *message,
00157 QCString &header_name,
00158 QString &header_value ){
00159 QString header = message->headerField( "X-Loop");
00160 if ( header.isEmpty() )
00161 return QString::null;
00162
00163 if (header.find( '@' ) < 2 )
00164 return QString::null;
00165
00166 header_name = "X-Loop";
00167 header_value = header;
00168 header.truncate(header.find( '@' ));
00169 return header;
00170 }
00171
00172
00173 static QString check_x_ml_name(const KMMessage *message,
00174 QCString &header_name,
00175 QString &header_value ){
00176 QString header = message->headerField( "X-ML-Name");
00177 if ( header.isEmpty() )
00178 return QString::null;
00179
00180 header_name = "X-ML-Name";
00181 header_value = header;
00182 header.truncate(header.find( '@' ));
00183 return header;
00184 }
00185
00186 MagicDetectorFunc magic_detector[] =
00187 {
00188 check_list_id,
00189 check_list_post,
00190 check_sender,
00191 check_x_mailing_list,
00192 check_mailing_list,
00193 check_delivered_to,
00194 check_x_beenthere,
00195 check_x_loop,
00196 check_x_ml_name
00197 };
00198
00199 static const int num_detectors = sizeof (magic_detector) / sizeof (magic_detector[0]);
00200
00201 QString
00202 KMMLInfo::name( const KMMessage *message, QCString &header_name,
00203 QString &header_value )
00204 {
00205 QString mlist;
00206 header_name = QCString();
00207 header_value = QString::null;
00208
00209 if ( !message )
00210 return QString::null;
00211
00212 for (int i = 0; i < num_detectors; i++) {
00213 mlist = magic_detector[i] (message, header_name, header_value);
00214 if ( !mlist.isNull() )
00215 return mlist;
00216 }
00217
00218
00219 return QString::null;
00220 }
This file is part of the documentation for kmail Library Version 3.2.2.