MsvEmailUtils.cpp
上传用户:sempras
上传日期:2007-03-04
资源大小:821k
文件大小:5k
源码类别:

Symbian

开发平台:

C/C++

  1. /*
  2. * ============================================================================
  3. *  Name     : CMsvEmailUtils from MsvEmailUtils.cpp
  4. *  Part of  : EmailExample
  5. *  Created  : 09/11/2003 by Forum Nokia
  6. *  Implementation notes:
  7. * Common helpers for different internet email protocols
  8. *
  9. *  Version  : 1.0
  10. *  Copyright: Nokia Corporation
  11. * ============================================================================
  12. */
  13. #include <mtclreg.h> //for CClientMtmRegistry
  14. #include <popcmtm.h> //for POP commands
  15. #include <impcmtm.h> //for IMAP commmands
  16. #include "MsvEmailUtils.h"
  17. // static creation. Removes object from clean up stack
  18. CMsvEmailUtils* CMsvEmailUtils::NewL(CMsvSession& aSession)
  19. {
  20. CMsvEmailUtils* self = NewLC(aSession);
  21. CleanupStack::Pop(self);
  22. return self;
  23. }
  24. // static creation. Leaves object on clean up stack
  25. CMsvEmailUtils* CMsvEmailUtils::NewLC(CMsvSession& aSession)
  26. {
  27. CMsvEmailUtils* self = new (ELeave)CMsvEmailUtils(aSession);
  28. CleanupStack::PushL(self);
  29. self->ConstructL();
  30. return self;
  31. }
  32. CMsvEmailUtils::CMsvEmailUtils(CMsvSession& aSession):
  33. iMsvSession(aSession)
  34. {}
  35. CMsvEmailUtils::~CMsvEmailUtils()
  36. {
  37. delete iMtmReg;
  38. }
  39. void CMsvEmailUtils::ConstructL()
  40. {}
  41. // find the messaging type ID of the given service UID
  42. TMsvId CMsvEmailUtils::GetServiceIdL(TUid aType)
  43. {
  44. return FindServiceL(aType);
  45. }
  46. // find the messaging type ID of the given folder then service UID
  47. TMsvId CMsvEmailUtils::GetFolderThenServiceIdL(TUid aType)
  48. {
  49. return FindFolderThenServiceL(aType);
  50. }
  51. // create an imap4 client mtm
  52. CImap4ClientMtm* CMsvEmailUtils::InstantiateImapClientMtmL(TMsvId aService)
  53. {
  54. // make sure we have created the mtm registry.
  55. if (!iMtmReg)
  56. {
  57. iMtmReg = CClientMtmRegistry::NewL(iMsvSession);
  58. }
  59. // create a imap4 client mtm
  60. CImap4ClientMtm* newMtm = static_cast<CImap4ClientMtm*>(iMtmReg->NewMtmL(KUidMsgTypeIMAP4));
  61. CleanupStack::PushL(newMtm);
  62. // get the entry associated with the given servive ID
  63. CMsvEntry* entry = iMsvSession.GetEntryL(aService);
  64. CleanupStack::PushL(entry);
  65. // set the entry as the current entry
  66. // mtm takes ownership of the entry
  67. newMtm->SetCurrentEntryL(entry);
  68. CleanupStack::Pop(entry);
  69. CleanupStack::Pop(newMtm);
  70. return newMtm;
  71. }
  72. // create a pop3 client mtm
  73. CPop3ClientMtm* CMsvEmailUtils::InstantiatePopClientMtmL(TMsvId aService)
  74. {
  75. // make sure we have created the mtm registry.
  76. if (!iMtmReg)
  77. {
  78. iMtmReg = CClientMtmRegistry::NewL(iMsvSession);
  79. }
  80. // create a pop3 client mtm
  81. CPop3ClientMtm* newMtm = static_cast<CPop3ClientMtm*>(iMtmReg->NewMtmL(KUidMsgTypePOP3));
  82. CleanupStack::PushL(newMtm);
  83. // get the entry associated with the given servive ID
  84. CMsvEntry* entry = iMsvSession.GetEntryL(aService);
  85. CleanupStack::PushL(entry);
  86. // set the entry as the current entry
  87. // mtm takes ownership of the entry
  88. newMtm->SetCurrentEntryL(entry);
  89. CleanupStack::Pop(entry);
  90. CleanupStack::Pop(newMtm);
  91. return newMtm;
  92. }
  93. // this function will return the first folder of first
  94. // service of given type if and only if folder exists
  95. // else it returns first service entry id or if not exists root id
  96. TMsvId CMsvEmailUtils::FindFolderThenServiceL(TUid aType)
  97.     {
  98. // select the root index to start the search
  99. CMsvEntry* currentEntry = iMsvSession.GetEntryL(KMsvRootIndexEntryId);
  100. CleanupStack::PushL(currentEntry);
  101. // don't sort the entries
  102.     currentEntry->SetSortTypeL(TMsvSelectionOrdering(KMsvNoGrouping,EMsvSortByNone, ETrue));
  103. TMsvId rc = KMsvRootIndexEntryId;
  104.     TInt count=currentEntry->Count();
  105. // loop for every child entry of the root index
  106.     for(TInt i = 0;i<count;i++)
  107.         {
  108.         const TMsvEntry& child = (*currentEntry)[i];
  109. // is the current child the same type as the type we are looking for ?
  110.     if (child.iMtm == aType)
  111.             {
  112. // selects first entry as index entry
  113. CMsvEntry* firstEntry = iMsvSession.GetEntryL(child.Id());
  114. CleanupStack::PushL(firstEntry);
  115. TInt innercount=firstEntry->Count();
  116. if( innercount )
  117. { //if has childs == folders take first
  118. const TMsvEntry& folder = (*firstEntry)[0];
  119. rc=folder.Id();
  120. }
  121. else
  122. {
  123. rc=child.Id();
  124. }
  125. CleanupStack::PopAndDestroy(firstEntry);
  126. break;
  127.             }
  128.         }//for
  129. CleanupStack::PopAndDestroy(currentEntry);
  130. // return the service id of the type if found.
  131. // otherwise return the root index
  132.     return rc;
  133.     }
  134. // find the message id of a service given a UID
  135. // this function will return the first service id for given type
  136. TMsvId CMsvEmailUtils::FindServiceL(TUid aType)
  137.     {
  138. // select the root index to start the search
  139. CMsvEntry* currentEntry = iMsvSession.GetEntryL(KMsvRootIndexEntryId);
  140. CleanupStack::PushL(currentEntry);
  141. // don't sort the entries
  142.     currentEntry->SetSortTypeL(TMsvSelectionOrdering(KMsvNoGrouping,EMsvSortByNone, ETrue));
  143. TMsvId rc = KMsvRootIndexEntryId;
  144.     TInt count=currentEntry->Count();
  145. // loop for every child entry of the root index
  146.     for(TInt i = 0;i<count;i++)
  147.         {
  148.         const TMsvEntry& child = (*currentEntry)[i];
  149. // is the current child the same type as the type we are looking for ?
  150.     if (child.iMtm == aType)
  151.             {
  152. // selects first entry as index entry
  153. rc=child.Id();
  154. break;
  155.             }
  156.         }//for
  157. CleanupStack::PopAndDestroy(currentEntry);
  158. // return the service id of the type if found.
  159. // otherwise return the root index
  160.     return rc;
  161.     }