Dacons LLP Mailit for C/C++ Version 1.0.8

EmaiMessagePartEnumerator.hpp

Go to the documentation of this file.
00001 
00014 #ifndef __EMAIMESSAGEPARTENUMERATOR_HPP__
00015 #define __EMAIMESSAGEPARTENUMERATOR_HPP__
00016 
00017 #include <EmaiMessage.hpp>
00018 
00024 namespace Emai
00025 {
00031 class MessagePartEnumerator
00032 {
00033 protected:
00034 
00035     Message                             mMessage;
00036 
00037                                         MessagePartEnumerator();//no implementation
00038                                         MessagePartEnumerator(
00039                                                 const MessagePartEnumerator&);//no implementation
00040 
00041 
00048     virtual void                        ProcessHeaderFields();
00049 
00050 
00059     virtual void                        ProcessContacts(
00060                                                 EmaiOptions inOptions);
00061 
00069     virtual void                        ProcessMessagePart(
00070                                                 MessagePart& inPart);
00071 
00072 
00080     virtual void                        OnContacts(
00081                                                 ContactList inContactList,
00082                                                 EmaiOptions inOptions) = 0;
00083 
00089     virtual void                        OnSubject(
00090                                                 EmaiConstUniCharPtr inSubject) = 0;
00091 
00105     virtual void                        OnPlainTextPart(
00106                                                 MessagePart& inPart,
00107                                                 const EmaiPartData& inPartData) = 0;
00108 
00122     virtual void                        OnUnicodePlainTextPart(
00123                                                 MessagePart& inPart,
00124                                                 const EmaiPartData& inPartData) = 0;
00125 
00139     virtual void                        OnHtmlTextPart(
00140                                                 MessagePart& inPart,
00141                                                 const EmaiPartData& inPartData) = 0;
00142 
00156     virtual void                        OnDataPart(
00157                                                 MessagePart& inPart,
00158                                                 const EmaiPartData& inPartData) = 0;
00159 
00173     virtual void                        OnCompositePartStart(
00174                                                 MessagePart& inPart,
00175                                                 const EmaiPartData& inPartData) = 0;
00176 
00190     virtual void                        OnCompositePartEnd(
00191                                                 MessagePart& inPart,
00192                                                 const EmaiPartData& inPartData) = 0;
00193 
00194 
00198     virtual void                        ProcessMessageParts();
00199 
00204     virtual void                        PreProcessMessageParts();
00205 
00210     virtual void                        PostProcessMessageParts();
00211 
00212 public:
00213     virtual                             ~MessagePartEnumerator();
00214     
00215     //constructors
00216                                         MessagePartEnumerator(
00217                                                 const Message& inMessage);
00218                                         
00222     void                                Enumerate();
00223 };
00224 
00225 
00226 /*
00227 // EmaiMessagePart implemetation
00228 */
00229 //constructors
00230 inline
00231 MessagePartEnumerator::MessagePartEnumerator(
00232         const Message& inMessage
00233     ):
00234     mMessage(inMessage)
00235 {
00236 }
00237 
00238 inline
00239 MessagePartEnumerator::~MessagePartEnumerator()
00240 {
00241 }
00242 
00243 inline void
00244 MessagePartEnumerator::Enumerate()
00245 {
00246     ProcessHeaderFields();
00247     ProcessMessageParts();
00248 }
00249 
00250 inline void
00251 MessagePartEnumerator::ProcessHeaderFields()
00252 {
00253     ProcessContacts(EmaiFrom);
00254     ProcessContacts(EmaiTo);
00255     ProcessContacts(EmaiCC);
00256     ProcessContacts(EmaiSender);
00257     ProcessContacts(EmaiReplyTo);
00258     ProcessContacts(EmaiBCC);
00259     EmaiConstUniCharPtr subject = mMessage.GetField(NULL, EmaiSubject);
00260     if (subject != NULL)
00261         OnSubject(subject);
00262 }
00263 
00264 inline void
00265 MessagePartEnumerator::ProcessContacts(
00266         EmaiOptions inOptions
00267     )
00268 {
00269     Emai::ContactList contactList;
00270     try
00271     {
00272         contactList = mMessage.CopyContactList(inOptions);
00273     }
00274     catch (Emai::Exception& /*exception*/)
00275     {
00276         //contact list cannot be parsed: just use noone@nowhere
00277         EmaiUniChar dummyAddress[] = {'n', 'o', 'o', 'n', 'e', '@', 'n', 'o', 'w', 'h', 'e', 'r', 'e', '\0'};
00278         contactList.AddContact(mMessage.GetField(NULL, inOptions), dummyAddress);
00279     }
00280     if (contactList != NULL)
00281         OnContacts(contactList, inOptions);
00282 }
00283 
00284 
00285 inline void
00286 MessagePartEnumerator::ProcessMessageParts()
00287 {
00288     PreProcessMessageParts();
00289     MessagePart rootPart(mMessage.GetRootPart());
00290     ProcessMessagePart(rootPart);
00291     PostProcessMessageParts();
00292 }
00293 
00294 inline void
00295 MessagePartEnumerator::PreProcessMessageParts()
00296 {
00297 }
00298 
00299 inline void
00300 MessagePartEnumerator::PostProcessMessageParts()
00301 {
00302 }
00303 
00304 inline void
00305 MessagePartEnumerator::ProcessMessagePart(
00306         MessagePart& inPart
00307     )
00308 {
00309     EmaiPartData dataDesc = {EmaiStructureVersionFirst};
00310     try
00311     {
00312         inPart.GetData(dataDesc);
00313         switch (dataDesc.partType)
00314         {
00315             case EmaiPartPlainTextData:
00316                 OnPlainTextPart(inPart, dataDesc);
00317                 break;
00318             case EmaiPartUnicodeTextData:
00319                 OnUnicodePlainTextPart(inPart, dataDesc);
00320                 break;
00321             case EmaiPartHTMLData:
00322                 OnHtmlTextPart(inPart, dataDesc);
00323                 break;
00324             case EmaiPartDataData:
00325                 OnDataPart(inPart, dataDesc);
00326                 break;
00327             case EmaiPartCompositeData:
00328             {
00329                 OnCompositePartStart(inPart, dataDesc);
00330 
00331                 for (EmaiUint32 i = 0; i < dataDesc.partData.composite.subPartCount;
00332                     ++i)
00333                 {
00334                     MessagePart subPart(dataDesc.partData.composite.subParts[i], true);
00335                     ProcessMessagePart(subPart);
00336                 }
00337 
00338                 OnCompositePartEnd(inPart, dataDesc);
00339 
00340                 break;
00341             }
00342             default:
00343                 break;
00344         }
00345     }
00346     catch (Emai::Exception& /*exception*/)
00347     {
00348     }
00349 }
00350 
00351 
00352 }
00353 #endif /*__EMAIMESSAGEPARTENUMERATOR_HPP__*/