kmail Library API Documentation

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 /* Sender: (owner-([^@]+)|([^@+]-owner)@ */
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 /* X-BeenThere: ([^@]+) */
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 /* Delivered-To:: <([^@]+) */
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 /* X-Mailing-List: <?([^@]+) */
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 /* List-Id: [^<]* <([^.]+) */
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 /* List-Post: <mailto:[^< ]*>) */
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 /* Mailing-List: list ([^@]+) */
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 /* X-Loop: ([^@]+) */
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 /* X-ML-Name: (.+) */
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 }
KDE Logo
This file is part of the documentation for kmail Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:37:34 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003