Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

564 lines
25 KiB

  1. //***************************************************************************
  2. // IMAP4 Message Sync Header File (CIMAPSync)
  3. // Written by Raymond Cheng, 5/5/98
  4. //***************************************************************************
  5. #ifndef __IMAPSync_H
  6. #define __IMAPSync_H
  7. //---------------------------------------------------------------------------
  8. // Includes
  9. //---------------------------------------------------------------------------
  10. #include "taskutil.h"
  11. //---------------------------------------------------------------------------
  12. // Data Types
  13. //---------------------------------------------------------------------------
  14. enum IMAP_SERVERSTATE
  15. {
  16. issNotConnected,
  17. issNonAuthenticated,
  18. issAuthenticated,
  19. issSelected
  20. };
  21. enum CONN_FSM_EVENT {
  22. CFSM_EVENT_INITIALIZE,
  23. CFSM_EVENT_CMDAVAIL,
  24. CFSM_EVENT_CONNCOMPLETE,
  25. CFSM_EVENT_SELECTCOMPLETE,
  26. CFSM_EVENT_HDRSYNCCOMPLETE,
  27. CFSM_EVENT_OPERATIONSTARTED,
  28. CFSM_EVENT_OPERATIONCOMPLETE,
  29. CFSM_EVENT_ERROR,
  30. CFSM_EVENT_CANCEL,
  31. CFSM_EVENT_MAX
  32. }; // CONN_FSM_EVENT
  33. // Keep CONN_FSM_STATE in sync with c_pConnFSMEventHandlers
  34. enum CONN_FSM_STATE {
  35. CFSM_STATE_IDLE,
  36. CFSM_STATE_WAITFORCONN,
  37. CFSM_STATE_WAITFORSELECT,
  38. CFSM_STATE_WAITFORHDRSYNC,
  39. CFSM_STATE_STARTOPERATION,
  40. CFSM_STATE_WAITFOROPERATIONDONE,
  41. CFSM_STATE_OPERATIONCOMPLETE,
  42. CFSM_STATE_MAX
  43. }; // CONN_FSM_STATE
  44. //---------------------------------------------------------------------------
  45. // Constants
  46. //---------------------------------------------------------------------------
  47. const char INVALID_HIERARCHY_CHAR = (char) 0xFF;
  48. //---------------------------------------------------------------------------
  49. // Forward Declarations
  50. //---------------------------------------------------------------------------
  51. class CIMAPSyncCB;
  52. class CRenameFolderInfo;
  53. //---------------------------------------------------------------------------
  54. // IMAPSync Util Function Prototypes
  55. //---------------------------------------------------------------------------
  56. HRESULT CreateImapStore(IUnknown *pUnkOuter, IUnknown **ppUnknown);
  57. //---------------------------------------------------------------------------
  58. // CIMAPSync Class Declaration
  59. //---------------------------------------------------------------------------
  60. class CIMAPSync :
  61. public IMessageServer,
  62. public IIMAPCallback,
  63. public ITransportCallbackService,
  64. public IOperationCancel,
  65. public IIMAPStore
  66. {
  67. public:
  68. // Constructor, Destructor
  69. CIMAPSync();
  70. ~CIMAPSync();
  71. // IUnknown Members
  72. STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObject);
  73. STDMETHODIMP_(ULONG) AddRef();
  74. STDMETHODIMP_(ULONG) Release();
  75. // IStoreSync Methods
  76. STDMETHODIMP Initialize(IMessageStore *pStore, FOLDERID idStoreRoot, IMessageFolder *pFolder, FOLDERID idFolder);
  77. STDMETHODIMP ResetFolder(IMessageFolder *pFolder, FOLDERID idFolder);
  78. STDMETHODIMP SetIdleCallback(IStoreCallback *pDefaultCallback);
  79. STDMETHODIMP SynchronizeFolder(SYNCFOLDERFLAGS dwFlags, DWORD cHeaders, IStoreCallback *pCallback);
  80. STDMETHODIMP GetMessage(MESSAGEID idMessage, IStoreCallback *pCallback);
  81. STDMETHODIMP PutMessage(FOLDERID idFolder, MESSAGEFLAGS dwFlags, LPFILETIME pftReceived, IStream *pStream, IStoreCallback *pCallback);
  82. STDMETHODIMP CopyMessages(IMessageFolder *pDestFldr, COPYMESSAGEFLAGS dwOptions, LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, IStoreCallback *pCallback);
  83. STDMETHODIMP DeleteMessages(DELETEMESSAGEFLAGS dwOptions, LPMESSAGEIDLIST pList, IStoreCallback *pCallback);
  84. STDMETHODIMP SetMessageFlags(LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, SETMESSAGEFLAGSFLAGS dwFlags, IStoreCallback *pCallback);
  85. STDMETHODIMP GetServerMessageFlags(MESSAGEFLAGS *pFlags);
  86. STDMETHODIMP SynchronizeStore(FOLDERID idParent, DWORD dwFlags,IStoreCallback *pCallback);
  87. STDMETHODIMP CreateFolder(FOLDERID idParent, SPECIALFOLDER tySpecial, LPCSTR pszName, FLDRFLAGS dwFlags, IStoreCallback *pCallback);
  88. STDMETHODIMP MoveFolder(FOLDERID idFolder, FOLDERID idParentNew,IStoreCallback *pCallback);
  89. STDMETHODIMP RenameFolder(FOLDERID idFolder, LPCSTR pszName, IStoreCallback *pCallback);
  90. STDMETHODIMP DeleteFolder(FOLDERID idFolder, DELETEFOLDERFLAGS dwFlags, IStoreCallback *pCallback);
  91. STDMETHODIMP SubscribeToFolder(FOLDERID idFolder, BOOL fSubscribe, IStoreCallback *pCallback);
  92. STDMETHODIMP GetFolderCounts(FOLDERID idFolder, IStoreCallback *pCallback);
  93. STDMETHODIMP GetNewGroups(LPSYSTEMTIME pSysTime, IStoreCallback *pCallback);
  94. STDMETHODIMP Close(DWORD dwFlags);
  95. STDMETHODIMP ConnectionAddRef() { return E_NOTIMPL; };
  96. STDMETHODIMP ConnectionRelease() { return E_NOTIMPL; };
  97. STDMETHODIMP GetWatchedInfo(FOLDERID id, IStoreCallback *pCallback) { return E_NOTIMPL; }
  98. STDMETHODIMP GetAdBarUrl(IStoreCallback *pCallback) { return E_NOTIMPL; };
  99. STDMETHODIMP GetMinPollingInterval(IStoreCallback *pCallback) { return E_NOTIMPL; };
  100. // ITransportCallbackService
  101. HRESULT STDMETHODCALLTYPE GetParentWindow(DWORD dwReserved, HWND *phwndParent);
  102. HRESULT STDMETHODCALLTYPE GetAccount(LPDWORD pdwServerType, IImnAccount **ppAccount);
  103. // ITransportCallback Members
  104. HRESULT STDMETHODCALLTYPE OnTimeout(DWORD *pdwTimeout, IInternetTransport *pTransport);
  105. HRESULT STDMETHODCALLTYPE OnLogonPrompt(LPINETSERVER pInetServer, IInternetTransport *pTransport);
  106. INT STDMETHODCALLTYPE OnPrompt(HRESULT hrError, LPCTSTR pszText, LPCTSTR pszCaption, UINT uType, IInternetTransport *pTransport);
  107. HRESULT STDMETHODCALLTYPE OnStatus(IXPSTATUS ixpStatus, IInternetTransport *pTransport);
  108. HRESULT STDMETHODCALLTYPE OnError(IXPSTATUS ixpStatus, LPIXPRESULT pResult, IInternetTransport *pTransport);
  109. HRESULT STDMETHODCALLTYPE OnCommand(CMDTYPE cmdtype, LPSTR pszLine, HRESULT hrResponse, IInternetTransport *pTransport);
  110. // IIMAPCallback Functions
  111. HRESULT STDMETHODCALLTYPE OnResponse(const IMAP_RESPONSE *pirIMAPResponse);
  112. // IOperationCancel
  113. HRESULT STDMETHODCALLTYPE Cancel(CANCELTYPE tyCancel);
  114. // IIMAPStore
  115. HRESULT STDMETHODCALLTYPE ExpungeOnExit(void);
  116. private:
  117. //---------------------------------------------------------------------------
  118. // Module Data Types
  119. //---------------------------------------------------------------------------
  120. enum IMAP_COMMAND
  121. {
  122. icNO_COMMAND, // This indicates there are no cmds currently in progress
  123. icLOGIN_COMMAND,
  124. icCAPABILITY_COMMAND,
  125. icSELECT_COMMAND,
  126. icEXAMINE_COMMAND,
  127. icCREATE_COMMAND,
  128. icDELETE_COMMAND,
  129. icRENAME_COMMAND,
  130. icSUBSCRIBE_COMMAND,
  131. icUNSUBSCRIBE_COMMAND,
  132. icLIST_COMMAND,
  133. icLSUB_COMMAND,
  134. icAPPEND_COMMAND,
  135. icCLOSE_COMMAND,
  136. icEXPUNGE_COMMAND,
  137. icSEARCH_COMMAND,
  138. icFETCH_COMMAND,
  139. icSTORE_COMMAND,
  140. icCOPY_COMMAND,
  141. icLOGOUT_COMMAND,
  142. icNOOP_COMMAND,
  143. icAUTHENTICATE_COMMAND,
  144. icSTATUS_COMMAND,
  145. icALL_COMMANDS
  146. }; // IMAP_COMMAND
  147. enum READWRITE_STATUS
  148. {
  149. rwsUNINITIALIZED,
  150. rwsREAD_WRITE,
  151. rwsREAD_ONLY
  152. }; // READWRITE_STATUS
  153. typedef struct tagIMAP_OPERATION
  154. {
  155. WPARAM wParam;
  156. LPARAM lParam;
  157. IMAP_COMMAND icCommandID;
  158. LPSTR pszCmdArgs;
  159. UINT uiPriority;
  160. IMAP_SERVERSTATE issMinimum;
  161. struct tagIMAP_OPERATION *pioNextCommand;
  162. } IMAP_OPERATION;
  163. typedef struct tagMARK_MSGS_INFO
  164. {
  165. LPMESSAGEIDLIST pList;
  166. ADJUSTFLAGS afFlags;
  167. IRangeList *pMsgRange;
  168. STOREOPERATIONTYPE sotOpType;
  169. } MARK_MSGS_INFO;
  170. typedef struct tagIMAP_COPYMOVE_INFO
  171. {
  172. COPYMESSAGEFLAGS dwOptions;
  173. LPMESSAGEIDLIST pList;
  174. IRangeList *pCopyRange;
  175. FOLDERID idDestFldr;
  176. } IMAP_COPYMOVE_INFO;
  177. // This structure makes me want to shower. It is used to pass info to
  178. // SendNextOperation, so I don't have to change its interface
  179. typedef struct tagAPPEND_SEND_INFO
  180. {
  181. LPSTR pszMsgFlags;
  182. FILETIME ftReceived;
  183. LPSTREAM lpstmMsg;
  184. } APPEND_SEND_INFO;
  185. enum HierCharFind_Stage
  186. {
  187. hcfPLAN_A = 0,
  188. hcfPLAN_B,
  189. hcfPLAN_C
  190. };
  191. typedef struct tagHierarchyCharFinder
  192. {
  193. HierCharFind_Stage hcfStage;
  194. BOOL fNonInboxNIL_Seen;
  195. BOOL fDotHierarchyCharSeen;
  196. BYTE bHierarchyCharBitArray[32]; // Bit-field array for 256 chars
  197. char szTempFldrName[CCHMAX_STRINGRES]; // For use by Plan C (CREATE/LIST/DELETE)
  198. } HIERARCHY_CHAR_FINDER;
  199. // Used to tell FindHierarchicalFolderName what flags to set if folder is created
  200. typedef struct tagADD_HIER_FLDR_OPTIONS
  201. {
  202. SPECIALFOLDER sfType;
  203. FLDRFLAGS ffFlagAdd;
  204. FLDRFLAGS ffFlagRemove;
  205. } ADD_HIER_FLDR_OPTIONS;
  206. // Used to remember which folder we're dealing with during CREATE sequence
  207. // (CREATE, then LIST, then SUBSCRIBE). Also used when detecting existence
  208. // of special folders.
  209. enum CREATESF_STAGE
  210. {
  211. CSF_INIT = 0,
  212. CSF_LIST,
  213. CSF_LSUBCREATE,
  214. CSF_CHECKSUB,
  215. CSF_NEXTFOLDER,
  216. };
  217. enum POSTCREATEOP
  218. {
  219. PCO_NONE = 0,
  220. PCO_FOLDERLIST,
  221. PCO_APPENDMSG,
  222. };
  223. #define CFI_RECEIVEDLISTING 0x00000001 // Received LIST or LSUB response matching pszFullFolderPath
  224. #define CFI_CREATEFAILURE 0x00000002 // CREATE failed with tagged NO so we attempted to list folder
  225. typedef struct tagCREATE_FOLDER_INFO
  226. {
  227. LPSTR pszFullFolderPath;
  228. FOLDERID idFolder; // Set after folder is created: allows us to subscribe fldr
  229. DWORD dwFlags; // Status flags like CFI_RECEIVEDLISTING
  230. DWORD dwCurrentSfType;
  231. DWORD dwFinalSfType; // Used to allow us to create all special folders
  232. CREATESF_STAGE csfCurrentStage; // Used to allow us to create all special folders
  233. LPARAM lParam; // Must carry around the lParam associated w/ fldr list
  234. POSTCREATEOP pcoNextOp; // Next operation to perform after folder creation
  235. } CREATE_FOLDER_INFO;
  236. typedef struct tagDELETE_FOLDER_INFO
  237. {
  238. LPSTR pszFullFolderPath;
  239. char cHierarchyChar;
  240. FOLDERID idFolder;
  241. } DELETE_FOLDER_INFO;
  242. //---------------------------------------------------------------------------
  243. // Module Variables
  244. //---------------------------------------------------------------------------
  245. ULONG m_cRef;
  246. IIMAPTransport2 *m_pTransport;
  247. INETSERVER m_rInetServerInfo;
  248. FOLDERID m_idFolder;
  249. FOLDERID m_idSelectedFolder; // Currently selected fldr, DO NOT CONFUSE with m_idCurrent
  250. FOLDERID m_idIMAPServer;
  251. LPSTR m_pszAccountID;
  252. TCHAR m_szAccountName[CCHMAX_ACCOUNT_NAME];
  253. LPSTR m_pszFldrLeafName;
  254. IMessageStore *m_pStore;
  255. IMessageFolder *m_pFolder;
  256. IStoreCallback *m_pDefCallback;
  257. IMAP_OPERATION *m_pioNextOperation;
  258. // The following variables should be reset when we exit a folder
  259. DWORD m_dwMsgCount;
  260. DWORD m_dwNumNewMsgs;
  261. DWORD m_dwNumHdrsDLed;
  262. DWORD m_dwNumUnreadDLed;
  263. DWORD m_dwNumHdrsToDL;
  264. DWORD m_dwUIDValidity,
  265. m_cFolders;
  266. DWORD m_dwSyncFolderFlags; // Copy of flags passed into SynchronizeFolder
  267. DWORD m_dwSyncToDo; // List of sync ops to do in current folder
  268. long m_lSyncFolderRefCount; // Lets us know when to send CFSM_EVENT_HDRSYNCCOMPLETE
  269. DWORD_PTR m_dwHighestCachedUID; // Highest cached UID when we processed SYNC_FOLDER_NEW_HEADERS
  270. READWRITE_STATUS m_rwsReadWriteStatus;
  271. CONNECT_STATE m_csNewConnState;
  272. IMAP_SERVERSTATE m_issCurrent;
  273. TCHAR m_cRootHierarchyChar; // For use during folder list (prefix creation) and GetFolderCounts
  274. HIERARCHY_CHAR_FINDER *m_phcfHierarchyCharInfo;
  275. char m_szRootFolderPrefix[MAX_PATH];
  276. BOOL m_fInited :1,
  277. m_fCreateSpecial :1,
  278. m_fPrefixExists :1,
  279. m_fMsgCountValid :1,
  280. m_fDisconnecting :1,
  281. m_fNewMail :1,
  282. m_fInbox :1,
  283. m_fDidFullSync :1, // TRUE if full synchronization performed
  284. m_fReconnect :1, // TRUE to suppress operation abortion on IXP_DISCONNECTED
  285. m_fTerminating :1; // TRUE if current op is going to CFSM_STATE_OPERATIONCOMPLETE
  286. // Central repository to store data on the current operation
  287. STOREOPERATIONTYPE m_sotCurrent; // Current operation in progress
  288. IStoreCallback *m_pCurrentCB; // Callback for current operation in progress
  289. FOLDERID m_idCurrent; // FolderID for current operation, DO NOT CONFUSE with m_idSelectedFolder
  290. BOOL m_fSubscribe; // For SOT_SUBSCRIBE_FOLDER op, this indicates sub/unsub
  291. IHashTable *m_pCurrentHash; // List of folders cached locally
  292. IHashTable *m_pListHash; // List of folders returned via LIST response
  293. DWORD m_dwThreadId;
  294. FILEADDRESS m_faStream;
  295. LPSTREAM m_pstmBody;
  296. MESSAGEID m_idMessage;
  297. BOOL m_fGotBody;
  298. // Connection FSM
  299. CONN_FSM_STATE m_cfsState;
  300. CONN_FSM_STATE m_cfsPrevState;
  301. HWND m_hwndConnFSM;
  302. HRESULT m_hrOperationResult;
  303. char m_szOperationProblem[2*CCHMAX_STRINGRES];
  304. char m_szOperationDetails[2*CCHMAX_STRINGRES];
  305. //---------------------------------------------------------------------------
  306. // Module Private Functions
  307. //---------------------------------------------------------------------------
  308. HRESULT PurgeMessageProgress(HWND hwndParent);
  309. HRESULT SetConnectionState(CONNECT_STATE tyConnect);
  310. HRESULT DownloadFoldersSequencer(const WPARAM wpTransactionID, const LPARAM lParam,
  311. HRESULT hrCompletionResult, const LPCSTR lpszResponseText, LPBOOL pfCompletion);
  312. HRESULT PostHCD(LPSTR pszErrorDescription, DWORD dwSizeOfErrorDescription,
  313. LPARAM lParam, LPBOOL pfCompletion);
  314. HRESULT CreatePrefix(LPSTR pszErrorDescription, DWORD dwSizeOfErrorDescription,
  315. LPARAM lParam, LPBOOL pfCompletion);
  316. void EndFolderList(void);
  317. HRESULT RenameSequencer(const WPARAM wpTransactionID, const LPARAM lParam,
  318. HRESULT hrCompletionResult, LPCSTR lpszResponseText, LPBOOL pfDone);
  319. inline BOOL EndOfRenameFolderPhaseOne(CRenameFolderInfo *pRenameInfo);
  320. inline BOOL EndOfRenameFolderPhaseTwo(CRenameFolderInfo *pRenameInfo);
  321. HRESULT RenameFolderPhaseTwo(CRenameFolderInfo *pRenameInfo,
  322. LPSTR szErrorDescription, DWORD dwSizeOfErrorDescription);
  323. void FlushOperationQueue(IMAP_SERVERSTATE issMaximum, HRESULT hrError);
  324. IMAP_SERVERSTATE IMAPCmdToMinISS(IMAP_COMMAND icCommandID);
  325. HRESULT GetNextOperation(IMAP_OPERATION **ppioOp);
  326. void DisposeOfWParamLParam(WPARAM wParam, LPARAM lParam, HRESULT hrResult);
  327. void NotifyMsgRecipients(DWORD_PTR dwUID, BOOL fCompletion,
  328. FETCH_BODY_PART *pFBPart, HRESULT hrCompletion, LPSTR pszDetails);
  329. void OnFolderExit(void);
  330. HRESULT _SelectFolder(FOLDERID idFolder);
  331. void LoadLeafFldrName(FOLDERID idFolder);
  332. void FillStoreError(LPSTOREERROR pErrorInfo, HRESULT hrResult,
  333. DWORD dwSocketError, LPSTR pszProblem, LPSTR pszDetails);
  334. HRESULT Fill_MESSAGEINFO(const FETCH_CMD_RESULTS_EX *pFetchResults,
  335. MESSAGEINFO *pMsgInfo);
  336. HRESULT ReadEnvelopeFields(MESSAGEINFO *pMsgInfo, const FETCH_CMD_RESULTS_EX *pFetchResults);
  337. HRESULT ConcatIMAPAddresses(LPSTR *ppszDisplay, LPSTR *ppszEmailAddr, IMAPADDR *piaIMAPAddr);
  338. HRESULT ConstructIMAPEmailAddr(CByteStream &bstmOut, IMAPADDR *piaIMAPAddr);
  339. HRESULT CheckUIDValidity(void);
  340. HRESULT SyncDeletedMessages(void);
  341. HRESULT DeleteHashedFolders(IHashTable *pHash);
  342. HRESULT DeleteFolderFromCache(FOLDERID idFolder, BOOL fRecursive);
  343. HRESULT DeleteLeafFolder(FOLDERID *pidCurrent);
  344. BOOL IsValidIMAPMailbox(LPSTR pszMailboxName, char cHierarchyChar);
  345. HRESULT AddFolderToCache(LPSTR pszMailboxName, IMAP_MBOXFLAGS imfMboxFlags,
  346. char cHierarchyChar, DWORD dwAFTCFlags, FOLDERID *pFolderID,
  347. SPECIALFOLDER sfType);
  348. LPSTR RemovePrefixFromPath(LPSTR pszPrefix, LPSTR pszMailboxName,
  349. char cHierarchyChar, LPBOOL pfValidPrefix, SPECIALFOLDER *psfType);
  350. HRESULT FindHierarchicalFolderName(LPSTR lpszFolderPath, char cHierarchyChar,
  351. FOLDERID *phfTarget, ADD_HIER_FLDR_OPTIONS *pahfoCreateInfo);
  352. HRESULT CreateFolderNode(FOLDERID idPrev, FOLDERID *pidCurrent,
  353. LPSTR pszCurrentFldrName, LPSTR pszNextFldrName, char cHierarchyChar,
  354. ADD_HIER_FLDR_OPTIONS *pahfoCreateInfo);
  355. HRESULT SetTranslationMode(FOLDERID idFolderID);
  356. BOOL isUSASCIIOnly(LPCSTR pszFolderName);
  357. HRESULT CheckFolderNameValidity(LPCSTR pszName);
  358. HRESULT RenameFolderHelper(FOLDERID idFolder, LPSTR pszFolderPath,
  359. char cHierarchyChar, LPSTR pszNewFolderPath);
  360. HRESULT RenameTreeTraversal(WPARAM wpOperation, CRenameFolderInfo *pRenameInfo,
  361. BOOL fIncludeRenameFolder);
  362. HRESULT RenameTreeTraversalHelper(WPARAM wpOperation, CRenameFolderInfo *pRenameInfo,
  363. LPSTR pszCurrentFldrPath, DWORD dwLengthOfCurrentPath, BOOL fIncludeThisFolder,
  364. FOLDERINFO *pfiCurrentFldrInfo);
  365. HRESULT SubscribeSubtree(FOLDERID idFolder, BOOL fSubscribe);
  366. void FindRootHierarchyChar(BOOL fPlanA_Only, LPARAM lParam);
  367. void AnalyzeHierarchyCharInfo();
  368. void StopHierarchyCharSearch();
  369. HRESULT LoadSaveRootHierarchyChar(BOOL fSaveHC);
  370. HRESULT CreateNextSpecialFolder(CREATE_FOLDER_INFO *pcfiCreateInfo, LPBOOL pfCompletion);
  371. HRESULT _StartFolderList(LPARAM lParam);
  372. // notification handlers
  373. HRESULT _OnCmdComplete(WPARAM tid, LPARAM lParam, HRESULT hrCompletionResult, LPCSTR lpszResponseText);
  374. HRESULT _OnMailBoxUpdate(MBOX_MSGCOUNT *pNewMsgCount);
  375. HRESULT _OnMsgDeleted(DWORD dwDeletedMsgSeqNum);
  376. HRESULT _OnFetchBody(HRESULT hrFetchBodyResult, FETCH_BODY_PART *pFetchBodyPart);
  377. HRESULT _OnUpdateMsg(WPARAM tid, HRESULT hrFetchCmdResult, FETCH_CMD_RESULTS_EX *pFetchResults);
  378. HRESULT _OnApplFlags(WPARAM tid, IMAP_MSGFLAGS imfApplicableFlags);
  379. HRESULT _OnPermFlags(WPARAM tid, IMAP_MSGFLAGS imfApplicableFlags, LPSTR lpszResponseText);
  380. HRESULT _OnUIDValidity(WPARAM tid, DWORD dwUIDValidity, LPSTR lpszResponseText);
  381. HRESULT _OnReadWriteStatus(WPARAM tid, BOOL bReadWrite, LPSTR lpszResponseText);
  382. HRESULT _OnTryCreate(WPARAM tid, LPSTR lpszResponseText);
  383. HRESULT _OnSearchResponse(WPARAM tid, IRangeList *prlSearchResults);
  384. HRESULT _OnMailBoxList(WPARAM tid, LPARAM lParam, LPSTR pszMailboxName,
  385. IMAP_MBOXFLAGS imfMboxFlags, char cHierarchyChar, BOOL fNoTranslation);
  386. HRESULT _OnAppendProgress(LPARAM lParam, DWORD dwCurrent, DWORD dwTotal);
  387. HRESULT _OnStatusResponse(IMAP_STATUS_RESPONSE *pisrStatusInfo);
  388. // internal state helpers
  389. HRESULT _EnsureSelected();
  390. HRESULT _Connect();
  391. HRESULT _Disconnect();
  392. HRESULT _EnsureInited();
  393. // init helpers
  394. HRESULT _LoadTransport();
  395. HRESULT _LoadAccountInfo();
  396. // fetch command helpers
  397. HRESULT UpdateMsgHeader(WPARAM tid, HRESULT hrFetchCmdResult, FETCH_CMD_RESULTS_EX *pFetchResults);
  398. HRESULT UpdateMsgBody(WPARAM tid, HRESULT hrFetchCmdResult, FETCH_CMD_RESULTS_EX *pFetchResults);
  399. HRESULT UpdateMsgFlags(WPARAM tid, HRESULT hrFetchCmdResult, FETCH_CMD_RESULTS_EX *pFetchResults);
  400. // command helpers
  401. HRESULT _ShowUserInfo(LPSTR pszTitle, LPSTR pszText1, LPSTR pszText2);
  402. HRESULT _SyncHeader(void);
  403. void ResetStatusCounts(void);
  404. HRESULT _SetMessageFlags(STOREOPERATIONTYPE sotOpType, LPMESSAGEIDLIST pList, LPADJUSTFLAGS pFlags, IStoreCallback *pCallback);
  405. // queuing support
  406. HRESULT _BeginOperation(STOREOPERATIONTYPE sotOpType, IStoreCallback *pCallback);
  407. HRESULT _EnqueueOperation(WPARAM wParam, LPARAM lParam, IMAP_COMMAND icCommandID, LPCSTR pszCmdArgs, UINT uiPriority);
  408. HRESULT _SendNextOperation(DWORD dwFlags);
  409. public:
  410. // Connection FSM
  411. HRESULT _ConnFSM_Idle(CONN_FSM_EVENT cfeEvent);
  412. HRESULT _ConnFSM_WaitForConn(CONN_FSM_EVENT cfeEvent);
  413. HRESULT _ConnFSM_WaitForSelect(CONN_FSM_EVENT cfeEvent);
  414. HRESULT _ConnFSM_WaitForHdrSync(CONN_FSM_EVENT cfeEvent);
  415. HRESULT _ConnFSM_StartOperation(CONN_FSM_EVENT cfeEvent);
  416. HRESULT _ConnFSM_WaitForOpDone(CONN_FSM_EVENT cfeEvent);
  417. HRESULT _ConnFSM_OperationComplete(CONN_FSM_EVENT cfeEvent);
  418. HRESULT _ConnFSM_HandleEvent(CONN_FSM_EVENT cfeEvent);
  419. HRESULT _ConnFSM_ChangeState(CONN_FSM_STATE cfsNewState);
  420. HRESULT _ConnFSM_QueueEvent(CONN_FSM_EVENT cfeEvent);
  421. IMAP_SERVERSTATE _StoreOpToMinISS(STOREOPERATIONTYPE sot);
  422. HRESULT _LaunchOperation(void);
  423. HRESULT _OnOperationComplete(void);
  424. static LRESULT CALLBACK _ConnFSMWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  425. }; // CIMAPSync
  426. // Connection FSM State Handler Functions (keep in sync with CONN_FSM_STATE)
  427. typedef HRESULT (CIMAPSync::*CONN_FSM_EVENT_HANDLER)(CONN_FSM_EVENT cfeEvent);
  428. const CONN_FSM_EVENT_HANDLER c_pConnFSMEventHandlers[] =
  429. {
  430. &CIMAPSync::_ConnFSM_Idle, // CFSM_STATE_IDLE,
  431. &CIMAPSync::_ConnFSM_WaitForConn, // CFSM_STATE_WAITFORCONN,
  432. &CIMAPSync::_ConnFSM_WaitForSelect, // CFSM_STATE_WAITFORSELECT,
  433. &CIMAPSync::_ConnFSM_WaitForHdrSync, // CFSM_STATE_WAITFORHDRSYNC,
  434. &CIMAPSync::_ConnFSM_StartOperation, // CFSM_STATE_STARTOPERATION,
  435. &CIMAPSync::_ConnFSM_WaitForOpDone, // CFSM_STATE_WAITFOROPERATIONDONE,
  436. &CIMAPSync::_ConnFSM_OperationComplete, // CSFM_STATE_OPERATIONCOMPLETE
  437. };
  438. //---------------------------------------------------------------------------
  439. // CRenameFolderInfo Class Declaration
  440. //---------------------------------------------------------------------------
  441. // This class makes me want to shower. It is used to pass info to
  442. // SendNextOperation, so I don't have to change its interface... but even with an
  443. // interface change, this is how the info structure would look.
  444. class CRenameFolderInfo {
  445. public:
  446. CRenameFolderInfo(void);
  447. ~CRenameFolderInfo(void);
  448. long AddRef(void);
  449. long Release(void);
  450. BOOL IsDone(void);
  451. HRESULT SetError(HRESULT hrResult, LPSTR pszProblemArg, LPSTR pszDetailsArg);
  452. LPSTR pszFullFolderPath; // Full folder path of old mailbox name
  453. char cHierarchyChar;
  454. LPSTR pszNewFolderPath; // Full folder path of new mailbox name
  455. FOLDERID idRenameFolder;
  456. int iNumSubscribeRespExpected; // Count num of SUBSCRIBE's sent to detect end of phase one/two
  457. int iNumListRespExpected; // Count num of LIST's sent to detect end of phase one
  458. int iNumRenameRespExpected; // Count num of additional RENAME's sent to detect end of phase one
  459. int iNumUnsubscribeRespExpected; // Count num of UNSUBSCRIBE's to detect end of phase two
  460. int iNumFailedSubs; // Count number of failed SUBSCRIBE's to verify that we addressed them all
  461. int iNumFailedUnsubs; // Count number of failed UNSUBSCRIBE's, to let the user know at the end
  462. BOOL fNonAtomicRename; // TRUE if listing old tree returned something
  463. LPSTR pszRenameCmdOldFldrPath; // Old folder path for rename cmd
  464. BOOL fPhaseOneSent; // TRUE if all Phase One commands have been successfully sent
  465. BOOL fPhaseTwoSent; // TRUE if all Phase Two commands have been successfully sent
  466. HRESULT hrLastError;
  467. LPSTR pszProblem;
  468. LPSTR pszDetails;
  469. private:
  470. long m_lRefCount;
  471. }; // class CRenameFolderInfo
  472. #endif // __IMAPSync_H