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

Symbian

开发平台:

C/C++

  1. /*
  2. * ============================================================================
  3. *  Name     : CPop3Mail from Pop3Mail.cpp
  4. *  Part of  : EmailExample
  5. *  Created  : 09/11/2003 by Forum Nokia
  6. *  Implementation notes:
  7. * basic statemachine
  8. *
  9. *  Version  : 1.0
  10. *  Copyright: Nokia Corporation
  11. * ============================================================================
  12. */
  13. #include <popcmtm.h> // for POP3
  14. #include "Pop3Mail.h"
  15. #include "MsvEmailUtils.h"
  16. // constant strings for info print messages used when fetching mail.
  17. _LIT(KIMConnect, "Connecting to mail server");
  18. _LIT(KIMFetch, "Fetching mail");
  19. _LIT(KIMDisconnect, "Disconnecting");
  20. _LIT(KIMComplete,   "Operation complete");
  21. _LIT(KFetchTitle, "Fetch mail");
  22. _LIT(KFetchMessage, "Getting mail");
  23. // static creation. Doesn't leave a copy on the clean up stack
  24. CPop3Mail* CPop3Mail::NewL(TRequestStatus& aStatus,CMsvSession& aMsvSession)
  25. {
  26. CPop3Mail* self = new (ELeave) CPop3Mail(aStatus,aMsvSession);
  27. CleanupStack::PushL(self);
  28. self->ConstructL();
  29. CleanupStack::Pop(self);
  30. return self;
  31. }
  32. // constructor
  33. CPop3Mail::CPop3Mail(TRequestStatus& aStatus,CMsvSession& aMsvSession)
  34. : CActive(CActive::EPriorityStandard), iObserverStatus(aStatus), iMsvSession(aMsvSession)
  35. {
  36. // add to active scheduler
  37. CActiveScheduler::Add(this);
  38. }
  39. // 2nd stage construction
  40. void CPop3Mail::ConstructL()
  41. {
  42. // set intitial object state
  43. iState=EInitialising;
  44. // create an empty selection to used laster.
  45. iMsvSelection = new(ELeave) CMsvEntrySelection();
  46. iState = EReady;
  47. Queue();
  48. }
  49. // destructor
  50. CPop3Mail::~CPop3Mail()
  51. {
  52. if(iOperation)
  53. {
  54. iOperation->Cancel();
  55. }
  56. Cancel();
  57. delete iOperation;
  58. delete iDialog;
  59. delete iMsvSelection;
  60. delete iPop3Mtm;
  61. delete iPop3Utils;
  62. }
  63. // active obejcts RunL functions acts as main state handling routine
  64. void CPop3Mail::RunL()
  65. {
  66. // get a pointer to our observers status
  67. TRequestStatus* st = &iObserverStatus;
  68. switch(iState)
  69. {
  70. case EReady:
  71. // tell the observer that the obejct os ready for use
  72. User::RequestComplete(st,KErrNone);
  73. break;
  74. case EConnecting:
  75. // display connecting message and initiate connection
  76. User::InfoPrint(KIMConnect);
  77. ExecuteConnectL();
  78. break;
  79. case EGetRemote:
  80. // display fetching mail message and initiate remote mail fetch
  81. User::InfoPrint(KIMFetch);
  82. ExecuteFetchMailL();
  83. break;
  84. case EDisconnectRemote:
  85. // display disconnect message and initiate disconnect
  86. User::InfoPrint(KIMDisconnect);
  87. ExecuteDisconnetL();
  88. break;
  89. case EDisconnecting:
  90. // display disconnecting message, reset object and complete observers request
  91. User::InfoPrint(KIMComplete);
  92. delete iDialog;
  93. iDialog=NULL;
  94. iState = EReady;
  95. delete iOperation;
  96. iOperation=NULL;
  97. User::RequestComplete(st,KErrNone);
  98. break;
  99. case ECanceling:
  100. // cancel the any outstanding operations and reset object.
  101. iStatus = KRequestPending;
  102. iState= EReady;
  103. delete iOperation;
  104. iOperation=NULL;
  105. User::RequestComplete(st,KErrCancel);
  106. default:
  107. break;
  108. }
  109. }
  110. // Connect to remote mail box
  111. void CPop3Mail::ExecuteConnectL()
  112. {
  113. // reset our status
  114. iStatus = KRequestPending;
  115. TBuf8<1> null;
  116. // execute the pop3 connect command
  117. MailCommandL(KPOP3MTMConnect,null);
  118. iState=EGetRemote;
  119. SetActive();
  120. }
  121. // fetch remote mail
  122. void CPop3Mail::ExecuteFetchMailL()
  123. {
  124. // get the msventry for this service (first pop3 service)
  125. CMsvEntry* service = iMsvSession.GetEntryL(iServiceId);
  126. CleanupStack::PushL(service);
  127. // get any children of the service - these are the remote message
  128. CMsvEntrySelection* children = service->ChildrenL();
  129. CleanupStack::PushL(children);
  130. CleanupStack::PopAndDestroy(children);
  131. CleanupStack::PopAndDestroy(service);
  132. // reset our status
  133. iStatus = KRequestPending;
  134. // setup a mail info buffer
  135. TImPop3GetMailInfo Pop3GetMailInfo;
  136. // setting iMaxEmailSize to KMaxTUint tells messaging to get the headers only
  137. Pop3GetMailInfo.iMaxEmailSize = KMaxTUint;
  138. // setup which service to download the messages from
  139. Pop3GetMailInfo.iDestinationFolder = iServiceId;
  140. // package up the information
  141. TPckgBuf<TImPop3GetMailInfo> package(Pop3GetMailInfo);
  142. // execute a pop3 copy mail command
  143. MailCommandL(KPOP3MTMCopyAllMailWhenAlreadyConnected,package);
  144. // set new state
  145. iState=EDisconnectRemote;
  146. SetActive();
  147. }
  148. // disconnect from service
  149. void CPop3Mail::ExecuteDisconnetL()
  150. {
  151. // reset our status
  152. iStatus = KRequestPending;
  153. // execute a disconnect from service command
  154. TBuf8<1> null;
  155. MailCommandL(KPOP3MTMDisconnect,null);
  156. iState=EDisconnecting;
  157. SetActive();
  158. }
  159. // interface to engine for fetching remote mail
  160. void CPop3Mail::FetchRemoteMailL(TMsvId aMailId)
  161. {
  162. // panic client is object is not in EReady state.
  163. __ASSERT_DEBUG(iState==EReady,User::Invariant());
  164. iMailId=aMailId;
  165. // reset our status
  166. iObserverStatus = KRequestPending;
  167. // create cancel dialog
  168. CCknCancelDialog* dialog=CCknCancelDialog::NewL(&iDialog,this,KFetchTitle,KFetchMessage);
  169. // activate cancel dialog
  170.     dialog->RunDlgLD();
  171. LoadMtmL();
  172. iState=EConnecting;
  173. // set active and complete our own request.
  174. Queue();
  175. }
  176. // executes pop3 mail commands
  177. void CPop3Mail::MailCommandL(TInt aCommand,TDes8& aParams)
  178. {
  179. // get the pop3 service id
  180. if(!iPop3Utils)
  181. {
  182. iPop3Utils = CMsvEmailUtils::NewL(iMsvSession);
  183. }
  184. TMsvId id = iPop3Utils->GetServiceIdL(KUidMsgTypePOP3);
  185. // make sure iServiceId is a remote type service
  186. if(iServiceId != KMsvLocalServiceIndexEntryId)
  187. {
  188. iMsvSelection->Reset();
  189. // append pop3 service entry id
  190. iMsvSelection->AppendL(id);
  191. // get the msventry for the service id
  192. CMsvEntry* service = iMsvSession.GetEntryL(iServiceId);
  193. CleanupStack::PushL(service);
  194. // make sure the mtm for the service is a pop3 type
  195. if(service->Entry().iMtm == KUidMsgTypePOP3)
  196. {
  197. // delete and reset any outstanding operation
  198. if(iOperation)
  199. {
  200. iOperation->Cancel();
  201. }
  202. delete iOperation;
  203. iOperation=NULL;
  204. iOperation=iPop3Mtm->InvokeAsyncFunctionL(aCommand,*iMsvSelection,aParams/*ptr*/,iStatus);
  205. }
  206. CleanupStack::PopAndDestroy(service);
  207. }
  208. else
  209. {
  210. // there is no POP3 mail service defined on the device.
  211. User::Leave(KErrNotFound);
  212. }
  213. }
  214. // load the pop3 mtm
  215. void CPop3Mail::LoadMtmL()
  216. {
  217. // get the id for the pop3 mtm
  218. if(!iPop3Utils)
  219. {
  220. iPop3Utils = CMsvEmailUtils::NewL(iMsvSession);
  221. }
  222. TMsvId id = iPop3Utils->GetServiceIdL(KUidMsgTypePOP3);
  223. // make sure that there is a pop3 mtm defined in the system
  224. if(id == KMsvRootIndexEntryId)
  225. {
  226. User::Leave(KErrNotFound);
  227. }
  228.     TMsvEntry tmp;
  229. // get the entry
  230. User::LeaveIfError(iMsvSession.GetEntry(id,iServiceId,tmp));
  231. // create a pop3 mtm from the service id
  232. iPop3Mtm = iPop3Utils->InstantiatePopClientMtmL(iServiceId);
  233. }
  234. // called by the user pressing the cancel button
  235. void CPop3Mail::CancelOperation()
  236. {
  237. // the dialog has destroyed itself so set the pointer to null
  238. iDialog=NULL;
  239. // cancel the operation if one exists
  240. if(iOperation)
  241. {
  242. iOperation->Cancel();
  243. }
  244. iState=ECanceling;
  245. if(!IsActive())
  246. {
  247. SetActive();
  248. }
  249. }
  250. // msvsession callback handling funtion
  251. void CPop3Mail::HandleSessionEventL(TMsvSessionEvent aEvent,TAny* /*aArg1*/,TAny* /*aArg2*/,TAny* /*aArg3*/)
  252. {
  253. switch(aEvent)
  254. {
  255. case MMsvSessionObserver::EMsvServerReady:
  256. if(iState==EInitialising)
  257. {
  258. // the message server is now ready for use.
  259. // set our state to ready and queue the next state.
  260. iState = EReady;
  261. Queue();
  262. }
  263. break;
  264. case EMsvServerTerminated:
  265. // the server has terminated
  266. iState=EInitialising;
  267. break;
  268. case MMsvSessionObserver::EMsvEntriesCreated:
  269. case MMsvSessionObserver::EMsvEntriesChanged:
  270. case MMsvSessionObserver::EMsvEntriesDeleted:
  271. case MMsvSessionObserver::EMsvEntriesMoved:
  272. case MMsvSessionObserver::EMsvMtmGroupInstalled:
  273. case MMsvSessionObserver::EMsvMtmGroupDeInstalled:
  274. case MMsvSessionObserver::EMsvGeneralError:
  275. case MMsvSessionObserver::EMsvCloseSession:
  276. case MMsvSessionObserver::EMsvServerFailedToStart:
  277. case MMsvSessionObserver::EMsvCorruptedIndexRebuilt:
  278. case MMsvSessionObserver::EMsvMediaChanged:
  279. case MMsvSessionObserver::EMsvMediaUnavailable:
  280. case MMsvSessionObserver::EMsvMediaAvailable:
  281. case MMsvSessionObserver::EMsvMediaIncorrect:
  282. case MMsvSessionObserver::EMsvCorruptedIndexRebuilding:
  283. break;
  284. }
  285. }
  286. void CPop3Mail::DoCancel()
  287. {}
  288. // don't handle errors at the moment
  289. TInt CPop3Mail::RunError(TInt aError)
  290. {
  291. return aError;
  292. }
  293. // complete our own status.
  294. // this allows the active scheduler chance to service other active objects before
  295. // return back to our RunL
  296. void CPop3Mail::Queue()
  297. {
  298. if(!IsActive())
  299. {
  300. SetActive();
  301. }
  302. TRequestStatus* st= &iStatus;
  303. User::RequestComplete(st,KErrNone);
  304. }