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();
00038 MessagePartEnumerator(
00039 const MessagePartEnumerator&);
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
00216 MessagePartEnumerator(
00217 const Message& inMessage);
00218
00222 void Enumerate();
00223 };
00224
00225
00226
00227
00228
00229
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& )
00275 {
00276
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& )
00347 {
00348 }
00349 }
00350
00351
00352 }
00353 #endif