Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2689|回复: 2
打印 上一主题 下一主题

imap连接原型

[复制链接]

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
跳转到指定楼层
楼主
发表于 2016-7-22 15:39:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

nsImapIncomingServer 维护imap连接队列 和任务队列
  1. nsImapIncomingServer

  2. nsCOMArray<nsIImapUrl> m_urlQueue;    任务队列
  3. nsCOMArray<nsIImapProtocol> m_connectionCache;  //imap连接线程队列


  4. GetImapConnection(nsIImapUrl * aImapUrl,..)
  5. {
  6.         1.从缓存中取可用连接
  7.         connection = m_connectionCache[i];
  8.         2.没有可用连接,且连接数少于最大连接数,则创建新连接
  9.         CreateProtocolInstance(nsIImapProtocol ** aImapConnection)
  10.         3.如果找不到可用连接,则放到队列中
  11.         m_urlQueue.AppendObject(aImapUrl);  //GetImapConnectionAndLoadUrl
  12. }
复制代码


回复

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
沙发
 楼主| 发表于 2016-7-25 13:43:43 | 只看该作者

  1. 5.关于任务执行(
  2. a.内部保持一个任务队列,下一个要执行的命令就从这里取  ??
  3. b.自身可以产生新任务,且可向上层发送
  4. c.任务支持优先级
  5. )

  6. 6.线程根据要执行的任务分类(
  7. a.T1(类型1):邮件同步线程,如:同步邮件头512封,下载邮件体512封,再同步邮件头512封,再下载邮件体512封.... 直到所有邮件都下载完。
  8. 邮件夹有一定的优先级,且点击的优先下,处理好中断,且从最新的邮件开始下。
  9. 新邮件的下载也放这里,注意优先级会提升
  10. b.T2(类型2): 处理本地相关操作任务,如:已读未读  星标  邮件上载 邮件复制、移动等。
  11. 对于批量操作用时较长时,要细分任务粒度,且相关交互操作优先级提升
  12. c.T3(类型3): 定时任务执行线程:如:定期更新邮件夹目录,定期同步邮件变动。
  13. d.T4(类型4):邮件体下载线程:针对点击的邮件优先处理,如果没下载完或这个邮件比较大,又切换到读其它的邮件,直接放弃该任务,直接进行下一个任务的下载。
  14. e.处理好相关同步,如a和d,已下载中的邮件,不要重复下载
  15. )

  16. 问题:
  17. 1.imap连接内部会产生新任务吗?
  18. 2.多个imap连接都产生同一个新任务如何处理?
  19. ImapThreadMainLoop
  20. ProcessCurrentURL
  21. ProcessSelectedStateURL   
  22. 如:
  23. 同步某邮件夹的更新的任务(ProcessMailboxUpdate),发现新邮件需要接收
  24. FetchMessage(idsToFetch, kFlags, fetchModifier);
  25. 则直接进行这项操作

  26. ----------------
  27. 加载任务后的处理流程
  28. NS_IMETHODIMP nsImapProtocol::LoadImapUrl(nsIURI * aURL, nsISupports * aConsumer)
  29. {
  30. //1.本地能处理的任务直接处理返回
  31. if (TryToRunUrlLocally(aURL, aConsumer))  
  32.       return NS_OK;
  33. //2.设置运行的Url
  34. SetupWithUrl(aURL.)
  35.         {
  36.         m_runningUrl = do_QueryInterface(aURL, &rv);
  37.         }
  38.         //3.获取url的执行动作
  39.         m_runningUrl->GetImapAction(&imapAction);
  40.         m_needNoop = (imapAction == nsIImapUrl::nsImapSelectFolder || imapAction == nsIImapUrl::nsImapDeleteAllMsgs);
  41. }

  42. 线程函数中处理要运行的Url
  43. ProcessSelectedStateURL(){
  44.         case nsIImapUrl::nsImapSelectFolder:
  45.                 ProcessMailboxUpdate(true);
  46. }

  47. ProcessMailboxUpdate(..)
  48. {
  49.         needFolderSync
  50.         FetchMessage("1:*", kFlags);
  51. }
  52. FetchMessage(...)
  53. {
  54.         SendData(protocolString);
  55.         ParseIMAPandCheckForNewMail(protocolString);
  56. }
  57. ParseIMAPandCheckForNewMail(..){
  58.         GetServerStateParser().ParseIMAPServerResponse(commandString, aIgnoreBadAndNOResponses);
  59. }

  60. nsImapServerResponseParser.cpp
  61. ParseIMAPServerResponse(..){
  62. response_data();
  63. }
  64. response_data()
  65. {
  66. mailbox_data();
  67. numeric_mailbox_data();
  68. }
  69. numeric_mailbox_data()
  70. {
  71. msg_fetch();
  72. }
  73. msg_fetch()
  74. {
  75. }

  76. //下面这些操作什么时候触发
  77. case nsIImapUrl::nsImapSaveMessageToDisk:  // nsImapService::SaveMessageToDisk
  78.       case nsIImapUrl::nsImapMsgFetch:  //nsImapService::GetHeaders
  79.       case nsIImapUrl::nsImapMsgFetchPeek:
  80.       case nsIImapUrl::nsImapMsgDownloadForOffline:  //上层指定要下载的邮件触发  nsImapService::DownloadMessagesForOffline(const nsACString &messageIds
  81.       case nsIImapUrl::nsImapMsgPreview:

  82. 一个自动处理离线下载的管理器
  83. nsAutoSyncState::DownloadMessagesForOffline(nsIArray *aMessagesList)
  84. nsAutoSyncManager::TimerCallback
  85. {
  86. autoSyncStateObj->ProcessExistingHeaders(kNumberOfHeadersToProcess, &leftToProcess);
  87. }
  88. --------------
  89. 任务的产生(粒度)
  90. 线程的分类管理
复制代码
回复 支持 反对

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
板凳
 楼主| 发表于 2016-7-25 13:45:17 | 只看该作者
  1. nsImapIncomingServer

  2. nsCOMArray<nsIImapUrl> m_urlQueue;    任务队列
  3. nsCOMArray<nsIImapProtocol> m_connectionCache;  //imap连接线程队列


  4. GetImapConnection(nsIImapUrl * aImapUrl,..)
  5. {
  6.         1.从缓存中取可用连接
  7.         connection = m_connectionCache[i];
  8.         2.没有可用连接,且连接数少于最大连接数,则创建新连接
  9.         CreateProtocolInstance(nsIImapProtocol ** aImapConnection)
  10.         3.如果找不到可用连接,则放到队列中
  11.         m_urlQueue.AppendObject(aImapUrl);  //GetImapConnectionAndLoadUrl
  12. }


  13. 获取连接以后加载执行任务
  14. rv = aProtocol->LoadImapUrl(mailnewsurl, aConsumer);


  15. nsImapIncomingServer调用nsIImapService为了构建nsIImapUrl,然后再转回来调用nsImapIncomingServer,然后是nsImapProtocol

  16. ---------相关难点-----
  17. 多个imap线程连接之间,如何进行分开不重复执行相关任务,
  18. imap线程内部永远不会自动产生新任务?
  19. 不需要时移除掉此连接 imapServer->RemoveConnection(this);

  20. 可自动获取上层的任务
  21. rv = m_imapServerSink->LoadNextQueuedUrl(this, &anotherUrlRun);

  22. LoadImapUrl的调用
  23. nsImapIncomingServer下
  24. GetImapConnectionAndLoadUrl   ---- nsImapMockChannel::ReadFromImapConnection  OnCacheEntryAvailable  AsyncOpen
  25. RetryUrl
  26. LoadNextQueuedUrl


  27. 是否可共用连接的判断 :
  28. in selected state can only run url with matching foldername  //选择状态下只能是同一邮件夹下的相关任务可以共用


  29. //头收完后,邮件体是如何触发收取的?
  30. HeaderFetchCompleted()
  31. nsImapMailFolder::ParseMsgHdrs(nsIImapProtocol *aProtocol, nsIImapHeaderXferInfo *aHdrXferInfo){
  32. }


  33.         !nsImapProtocol::LoadImapUrl(nsIURI * aURL, nsISupports * aConsumer) 行 2205        C++
  34. >        !nsImapIncomingServer::LoadNextQueuedUrl(nsIImapProtocol * aProtocol, bool * aResult) 行 575        C++
  35.         !`anonymous namespace'::SyncRunnable2<nsIImapMailFolderSink,unsigned int,nsIImapUrl *>::Run() 行 147        C++   ---界面点击触发,不点不触发?



  36.         >        !nsImapProtocol::LoadImapUrl(nsIURI * aURL, nsISupports * aConsumer) 行 2205        C++
  37.         !nsImapIncomingServer::LoadNextQueuedUrl(nsIImapProtocol * aProtocol, bool * aResult) 行 575        C++
  38.         !`anonymous namespace'::SyncRunnable2<nsIImapMailFolderSink,unsigned int,nsIImapUrl *>::Run() 行 147        C++  //nsImapMsgDownloadForOffline = 268435506,


  39.         nsImapMsgDownloadForOffline  邮件头下载完后,调用自动同步 HeaderFetchCompleted -> nsAutoSyncState
  40.                  !nsImapService::DownloadMessagesForOffline(const nsACString & messageIds, nsIMsgFolder * aFolder, nsIUrlListener * aUrlListener, nsIMsgWindow * aMsgWindow) 行 3255        C++
  41.         !nsAutoSyncState::DownloadMessagesForOffline(nsIArray * aMessagesList) 行 651        C++
  42.         !nsAutoSyncManager::DownloadMessagesForOffline(nsIAutoSyncState * aAutoSyncStateObj, unsigned int aSizeLimit) 行 982        C++
  43.         !nsAutoSyncManager::OnDownloadQChanged(nsIAutoSyncState * aAutoSyncStateObj) 行 1206        C++
  44.         !nsAutoSyncState::PlaceIntoDownloadQ(const nsTArray<unsigned int> & aMsgKeyList) 行 154        C++
  45. >        !nsImapMailFolder::HeaderFetchCompleted(nsIImapProtocol * aProtocol) 行 5901        C++

复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-26 01:57 , Processed in 0.058275 second(s), 18 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表