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.

2000 lines
50 KiB

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3. #include "stdafx.h"
  4. #define __FILE_ID__ 5
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. extern CClientConsoleApp theApp;
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CMainFrame
  13. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  14. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  15. //{{AFX_MSG_MAP(CMainFrame)
  16. ON_WM_CREATE()
  17. ON_WM_CLOSE()
  18. ON_WM_SETTINGCHANGE()
  19. ON_WM_SYSCOLORCHANGE()
  20. //}}AFX_MSG_MAP
  21. ON_COMMAND(ID_HELP_FINDER, OnHelpContents)
  22. ON_MESSAGE(WM_HELP, OnHelp) // F1
  23. ON_COMMAND(ID_VIEW_REFRESH_FOLDER, OnRefreshFolder)
  24. ON_COMMAND(ID_SEND_NEW_FAX, OnSendNewFax)
  25. ON_COMMAND(ID_RECEIVE_NEW_FAX, OnReceiveNewFax)
  26. ON_COMMAND(ID_TOOLS_USER_INFO, OnViewOptions)
  27. ON_COMMAND(ID_TOOLS_CONFIG_WIZARD, OnToolsConfigWizard)
  28. ON_COMMAND(ID_TOOLS_ADMIN_CONSOLE, OnToolsAdminConsole)
  29. ON_COMMAND(ID_TOOLS_MONITOR, OnToolsMonitor)
  30. ON_COMMAND(ID_VIEW_COVER_PAGES, OnToolsCoverPages)
  31. ON_COMMAND(ID_VIEW_SERVER_STATUS, OnToolsServerStatus)
  32. ON_COMMAND(ID_TOOLS_FAX_PRINTER_PROPS, OnToolsFaxPrinterProps)
  33. ON_COMMAND(ID_VIEW_SELECT_COLUMNS, OnSelectColumns)
  34. ON_COMMAND(ID_IMPORT_INBOX, OnImportInbox)
  35. ON_COMMAND(ID_IMPORT_SENT, OnImportSentItems)
  36. ON_UPDATE_COMMAND_UI_RANGE(ID_TOOLS_CONFIG_WIZARD, ID_TOOLS_MONITOR, OnUpdateWindowsXPTools)
  37. ON_UPDATE_COMMAND_UI(ID_VIEW_SELECT_COLUMNS, OnUpdateSelectColumns)
  38. ON_UPDATE_COMMAND_UI(ID_VIEW_SERVER_STATUS, OnUpdateServerStatus)
  39. ON_UPDATE_COMMAND_UI(ID_VIEW_REFRESH_FOLDER, OnUpdateRefreshFolder)
  40. ON_UPDATE_COMMAND_UI(ID_INDICATOR_FOLDER_ITEMS_COUNT, OnUpdateFolderItemsCount)
  41. ON_UPDATE_COMMAND_UI(ID_INDICATOR_ACTIVITY, OnUpdateActivity)
  42. ON_UPDATE_COMMAND_UI(ID_SEND_NEW_FAX, OnUpdateSendNewFax)
  43. ON_UPDATE_COMMAND_UI(ID_RECEIVE_NEW_FAX, OnUpdateReceiveNewFax)
  44. ON_UPDATE_COMMAND_UI(ID_IMPORT_SENT, OnUpdateImportSent)
  45. ON_UPDATE_COMMAND_UI(ID_HELP_FINDER, OnUpdateHelpContents)
  46. ON_MESSAGE(WM_POPUP_ERROR, OnPopupError)
  47. ON_MESSAGE(WM_CONSOLE_SET_ACTIVE_FOLDER, OnSetActiveFolder)
  48. ON_MESSAGE(WM_CONSOLE_SELECT_ITEM, OnSelectItem)
  49. ON_MESSAGE(WM_QUERYENDSESSION, OnQueryEndSession)
  50. ON_NOTIFY(NM_DBLCLK, AFX_IDW_STATUS_BAR, OnStatusBarDblClk )
  51. END_MESSAGE_MAP()
  52. //
  53. // List of indices of items used in the Incoming folder
  54. //
  55. #define INCOMING_DEF_COL_NUM 8
  56. static MsgViewItemType IncomingColumnsUsed[] =
  57. {
  58. MSG_VIEW_ITEM_ICON, // default 0
  59. MSG_VIEW_ITEM_TRANSMISSION_START_TIME, // default 1
  60. MSG_VIEW_ITEM_TSID, // default 2
  61. MSG_VIEW_ITEM_CALLER_ID, // default 3
  62. MSG_VIEW_ITEM_STATUS, // default 4
  63. MSG_VIEW_ITEM_EXTENDED_STATUS, // default 5
  64. MSG_VIEW_ITEM_CURRENT_PAGE, // default 6
  65. MSG_VIEW_ITEM_SIZE, // default 7
  66. MSG_VIEW_ITEM_SERVER,
  67. MSG_VIEW_ITEM_CSID,
  68. MSG_VIEW_ITEM_DEVICE,
  69. MSG_VIEW_ITEM_ROUTING_INFO,
  70. MSG_VIEW_ITEM_SEND_TIME, // schedule time
  71. MSG_VIEW_ITEM_TRANSMISSION_END_TIME,
  72. MSG_VIEW_ITEM_ID,
  73. MSG_VIEW_ITEM_NUM_PAGES,
  74. MSG_VIEW_ITEM_RETRIES,
  75. MSG_VIEW_ITEM_END // End of list
  76. };
  77. //
  78. // List of indices of items used in the Inbox folder
  79. //
  80. #define INBOX_DEF_COL_NUM 8
  81. static MsgViewItemType InboxColumnsUsed[] =
  82. {
  83. MSG_VIEW_ITEM_ICON, // default 0
  84. MSG_VIEW_ITEM_TRANSMISSION_START_TIME, // default 1
  85. MSG_VIEW_ITEM_TSID, // default 2
  86. MSG_VIEW_ITEM_CALLER_ID, // default 3
  87. MSG_VIEW_ITEM_NUM_PAGES, // default 4
  88. MSG_VIEW_ITEM_STATUS, // default 5
  89. MSG_VIEW_ITEM_SIZE, // default 6
  90. MSG_VIEW_ITEM_CSID, // default 7
  91. MSG_VIEW_ITEM_SERVER,
  92. MSG_VIEW_ITEM_TRANSMISSION_END_TIME,
  93. MSG_VIEW_ITEM_TRANSMISSION_DURATION,
  94. MSG_VIEW_ITEM_DEVICE,
  95. MSG_VIEW_ITEM_ROUTING_INFO,
  96. MSG_VIEW_ITEM_ID,
  97. MSG_VIEW_ITEM_END // End of list
  98. };
  99. //
  100. // List of indices of items used in the sent items folder
  101. //
  102. #define SENT_ITEMS_DEF_COL_NUM 8
  103. static MsgViewItemType SentItemsColumnsUsed[] =
  104. {
  105. MSG_VIEW_ITEM_ICON, // default 0
  106. MSG_VIEW_ITEM_TRANSMISSION_START_TIME,// default 1
  107. MSG_VIEW_ITEM_RECIPIENT_NAME, // default 2
  108. MSG_VIEW_ITEM_RECIPIENT_NUMBER, // default 3
  109. MSG_VIEW_ITEM_SUBJECT, // default 4
  110. MSG_VIEW_ITEM_DOC_NAME, // default 5
  111. MSG_VIEW_ITEM_NUM_PAGES, // default 6
  112. MSG_VIEW_ITEM_SIZE, // default 7
  113. MSG_VIEW_ITEM_SERVER,
  114. MSG_VIEW_ITEM_USER,
  115. MSG_VIEW_ITEM_PRIORITY,
  116. MSG_VIEW_ITEM_CSID,
  117. MSG_VIEW_ITEM_TSID,
  118. MSG_VIEW_ITEM_ORIG_TIME,
  119. MSG_VIEW_ITEM_RETRIES,
  120. MSG_VIEW_ITEM_ID,
  121. MSG_VIEW_ITEM_BROADCAST_ID,
  122. MSG_VIEW_ITEM_SUBMIT_TIME,
  123. MSG_VIEW_ITEM_TRANSMISSION_DURATION,
  124. MSG_VIEW_ITEM_TRANSMISSION_END_TIME,
  125. MSG_VIEW_ITEM_BILLING,
  126. MSG_VIEW_ITEM_SENDER_NAME,
  127. MSG_VIEW_ITEM_SENDER_NUMBER,
  128. MSG_VIEW_ITEM_END // End of list
  129. };
  130. //
  131. // List of indices of items used in the Outbox folder
  132. //
  133. #define OUTBOX_DEF_COL_NUM 9
  134. static MsgViewItemType OutboxColumnsUsed[] =
  135. {
  136. MSG_VIEW_ITEM_ICON, // default 0
  137. MSG_VIEW_ITEM_SUBMIT_TIME, // default 1
  138. MSG_VIEW_ITEM_RECIPIENT_NAME, // default 2
  139. MSG_VIEW_ITEM_RECIPIENT_NUMBER, // default 3
  140. MSG_VIEW_ITEM_SUBJECT, // default 4
  141. MSG_VIEW_ITEM_DOC_NAME, // default 5
  142. MSG_VIEW_ITEM_STATUS, // default 6
  143. MSG_VIEW_ITEM_EXTENDED_STATUS, // default 7
  144. MSG_VIEW_ITEM_CURRENT_PAGE, // default 8
  145. MSG_VIEW_ITEM_SEND_TIME,
  146. MSG_VIEW_ITEM_SERVER,
  147. MSG_VIEW_ITEM_NUM_PAGES,
  148. MSG_VIEW_ITEM_USER,
  149. MSG_VIEW_ITEM_PRIORITY,
  150. MSG_VIEW_ITEM_CSID,
  151. MSG_VIEW_ITEM_TSID,
  152. MSG_VIEW_ITEM_ORIG_TIME,
  153. MSG_VIEW_ITEM_SIZE,
  154. MSG_VIEW_ITEM_DEVICE,
  155. MSG_VIEW_ITEM_RETRIES,
  156. MSG_VIEW_ITEM_ID,
  157. MSG_VIEW_ITEM_BROADCAST_ID,
  158. MSG_VIEW_ITEM_BILLING,
  159. MSG_VIEW_ITEM_END // End of list
  160. };
  161. //
  162. // Status bar indicators
  163. //
  164. static UINT indicators[] =
  165. {
  166. ID_SEPARATOR, // status line indicator (menu item)
  167. ID_INDICATOR_FOLDER_ITEMS_COUNT, // status line indicator (num of folder items)
  168. ID_INDICATOR_ACTIVITY, // status line indicator (Activity)
  169. };
  170. /////////////////////////////////////////////////////////////////////////////
  171. // CMainFrame construction/destruction
  172. CMainFrame::CMainFrame() :
  173. m_pInitialRightPaneView (NULL),
  174. m_pLeftView (NULL),
  175. m_pIncomingView(NULL),
  176. m_pInboxView(NULL),
  177. m_pSentItemsView(NULL),
  178. m_pOutboxView(NULL)
  179. {}
  180. CMainFrame::~CMainFrame()
  181. {
  182. }
  183. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  184. {
  185. int iRes = 0;
  186. DWORD dwRes;
  187. DBG_ENTER(TEXT("CMainFrame::OnCreate"), (HRESULT &)iRes);
  188. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  189. {
  190. iRes = -1;
  191. CALL_FAIL (STARTUP_ERR, TEXT("CFrameWnd::OnCreate"), iRes);
  192. return iRes;
  193. }
  194. FrameToSavedLayout();
  195. //
  196. // Create the toolbar
  197. //
  198. if (!m_wndToolBar.CreateEx(this) ||
  199. !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  200. {
  201. iRes = -1;
  202. CALL_FAIL (STARTUP_ERR,
  203. TEXT("CToolBar::CreateEx or CToolBar::LoadToolBar"),
  204. iRes);
  205. return iRes;
  206. }
  207. //
  208. // Create the rebar and place the toolbar + dialogbar in it.
  209. //
  210. if (!m_wndReBar.Create(this) ||
  211. !m_wndReBar.AddBar(&m_wndToolBar))
  212. {
  213. iRes = -1;
  214. CALL_FAIL (STARTUP_ERR,
  215. TEXT("CReBar::Create or CReBar::AddBar"),
  216. iRes);
  217. return iRes;
  218. }
  219. //
  220. // Create the status bar
  221. //
  222. if (!m_wndStatusBar.CreateEx (this, SBARS_SIZEGRIP | SBT_TOOLTIPS) ||
  223. !m_wndStatusBar.SetIndicators (indicators, sizeof(indicators)/sizeof(UINT)))
  224. {
  225. iRes = -1;
  226. CALL_FAIL (STARTUP_ERR,
  227. TEXT("CStatusBar::CreateEx or CStatusBar::SetIndicators"),
  228. iRes);
  229. return iRes;
  230. }
  231. //
  232. // set pane width
  233. //
  234. m_wndStatusBar.SetPaneInfo(STATUS_PANE_ITEM_COUNT,
  235. ID_INDICATOR_FOLDER_ITEMS_COUNT,
  236. SBPS_NORMAL,
  237. 80);
  238. m_wndStatusBar.SetPaneInfo(STATUS_PANE_ACTIVITY,
  239. ID_INDICATOR_ACTIVITY,
  240. SBPS_STRETCH,
  241. 200);
  242. // TODO: Remove this if you don't want tool tips
  243. m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY);
  244. //
  245. // Load strings used for display throughout the application - priority & job status
  246. //
  247. dwRes = CViewRow::InitStrings ();
  248. if (ERROR_SUCCESS != dwRes)
  249. {
  250. iRes = -1;
  251. CALL_FAIL (RESOURCE_ERR, TEXT("CJob::InitStrings"), dwRes);
  252. return iRes;
  253. }
  254. return iRes;
  255. }
  256. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
  257. CCreateContext* pContext)
  258. {
  259. BOOL bRes = TRUE;
  260. DBG_ENTER(TEXT("CMainFrame::OnCreateClient"), bRes);
  261. //
  262. // Create splitter window
  263. //
  264. if (!m_wndSplitter.CreateStatic(this, 1, 2))
  265. {
  266. bRes = FALSE;
  267. CALL_FAIL (STARTUP_ERR, TEXT("CSplitterWnd::CreateStatic"), bRes);
  268. return bRes;
  269. }
  270. CRect r;
  271. GetWindowRect(r);
  272. int iLeftWidth = int(r.Width()*0.32),
  273. iRightWidth = int(r.Width()*0.68);
  274. if (!m_wndSplitter.CreateView(0,
  275. 0,
  276. RUNTIME_CLASS(CLeftView),
  277. CSize(iLeftWidth, r.Height()),
  278. pContext
  279. ) ||
  280. !m_wndSplitter.CreateView(0,
  281. 1,
  282. RUNTIME_CLASS(CClientConsoleView),
  283. CSize(iRightWidth, r.Height()),
  284. pContext
  285. )
  286. )
  287. {
  288. m_wndSplitter.DestroyWindow();
  289. bRes = FALSE;
  290. CALL_FAIL (STARTUP_ERR, TEXT("CSplitterWnd::CreateView"), bRes);
  291. return bRes;
  292. }
  293. m_pInitialRightPaneView = GetRightPane ();
  294. m_pLeftView = (CLeftView *)(m_wndSplitter.GetPane(0,0));
  295. SplitterToSavedLayout();
  296. return bRes;
  297. } // CMainFrame::OnCreateClient
  298. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  299. {
  300. BOOL bRes = TRUE;
  301. DBG_ENTER(TEXT("CMainFrame::PreCreateWindow"), bRes);
  302. //
  303. // The following line removes the document name from the application's title.
  304. //
  305. cs.style &= ~FWS_ADDTOTITLE;
  306. //
  307. // Use the unique class name so that FindWindow can later locate it.
  308. //
  309. cs.lpszClass = theApp.GetClassName();
  310. if( !CFrameWnd::PreCreateWindow(cs) )
  311. {
  312. bRes = FALSE;
  313. CALL_FAIL (STARTUP_ERR, TEXT("CFrameWnd::PreCreateWindow"), bRes);
  314. return bRes;
  315. }
  316. return bRes;
  317. }
  318. /////////////////////////////////////////////////////////////////////////////
  319. // CMainFrame diagnostics
  320. #ifdef _DEBUG
  321. void CMainFrame::AssertValid() const
  322. {
  323. CFrameWnd::AssertValid();
  324. }
  325. void CMainFrame::Dump(CDumpContext& dc) const
  326. {
  327. CFrameWnd::Dump(dc);
  328. }
  329. #endif //_DEBUG
  330. /////////////////////////////////////////////////////////////////////////////
  331. // CMainFrame message handlers
  332. CListView* CMainFrame::GetRightPane()
  333. {
  334. CWnd* pWnd = m_wndSplitter.GetPane(0, 1);
  335. return (CListView *)pWnd;
  336. }
  337. void
  338. CMainFrame::SwitchRightPaneView(
  339. CListView *pNewView
  340. )
  341. /*++
  342. Routine name : CMainFrame::SwitchRightPaneView
  343. Routine description:
  344. Switches the view displayed in the right pane to a new view
  345. Author:
  346. Eran Yariv (EranY), Jan, 2000
  347. Arguments:
  348. pNewView [in] - View to display in the right pane
  349. Return Value:
  350. None.
  351. --*/
  352. {
  353. DBG_ENTER(TEXT("CMainFrame::SwitchRightPaneView"));
  354. ASSERT_VALID (&m_wndSplitter);
  355. if (!pNewView)
  356. {
  357. //
  358. // Switch back to our initial right pane view
  359. //
  360. pNewView = m_pInitialRightPaneView;
  361. }
  362. ASSERTION (pNewView);
  363. ASSERT_KINDOF (CListView, pNewView);
  364. //
  365. // Get window at current pane
  366. //
  367. CWnd *pPaneWnd = m_wndSplitter.GetPane (0,1);
  368. ASSERT_VALID (pPaneWnd);
  369. CListView *pCurrentView = static_cast<CListView*> (pPaneWnd);
  370. //
  371. // Exchange view window ID's so RecalcLayout() works.
  372. //
  373. UINT uCurrentViewId = ::GetWindowLong(pCurrentView->m_hWnd, GWL_ID);
  374. UINT uNewViewId = ::GetWindowLong(pNewView->m_hWnd, GWL_ID);
  375. if (uCurrentViewId == uNewViewId)
  376. {
  377. //
  378. // Same view - do nothing
  379. //
  380. return;
  381. }
  382. ::SetWindowLong(pCurrentView->m_hWnd, GWL_ID, uNewViewId);
  383. ::SetWindowLong(pNewView->m_hWnd, GWL_ID, uCurrentViewId);
  384. //
  385. // Hide current view and show the new view
  386. //
  387. pCurrentView->ShowWindow(SW_HIDE);
  388. pNewView->ShowWindow(SW_SHOW);
  389. SetActiveView(pNewView);
  390. //
  391. // Cause redraw in new view
  392. //
  393. pNewView->Invalidate();
  394. //
  395. // Recalc frame layout
  396. //
  397. m_wndSplitter.RecalcLayout ();
  398. } // CMainFrame::SwitchRightPaneView
  399. void CMainFrame::OnRefreshFolder()
  400. /*++
  401. Routine name : CMainFrame::OnRefreshFolder
  402. Routine description:
  403. Called by the framework to refresh the current folder (F5)
  404. Author:
  405. Eran Yariv (EranY), Jan, 2000
  406. Arguments:
  407. Return Value:
  408. None.
  409. --*/
  410. {
  411. DBG_ENTER(TEXT("CMainFrame::OnRefreshFolder"));
  412. DWORD dwRes = GetLeftView()->RefreshCurrentFolder ();
  413. }
  414. void
  415. CMainFrame::OnSelectColumns()
  416. {
  417. DBG_ENTER(TEXT("CMainFrame::OnSelectColumns"));
  418. DWORD dwRes = m_pLeftView->OpenSelectColumnsDlg();
  419. if(ERROR_SUCCESS != dwRes)
  420. {
  421. CALL_FAIL (GENERAL_ERR, TEXT("CLeftView::OpenSelectColumnsDlg"), dwRes);
  422. PopupError(dwRes);
  423. }
  424. }
  425. void
  426. CMainFrame::OnUpdateSelectColumns(
  427. CCmdUI* pCmdUI
  428. )
  429. {
  430. DBG_ENTER(TEXT("CMainFrame::OnUpdateSelectColumns"));
  431. pCmdUI->Enable(m_pLeftView->CanOpenSelectColumnsDlg());
  432. }
  433. void
  434. CMainFrame::OnUpdateFolderItemsCount(
  435. CCmdUI* pCmdUI
  436. )
  437. /*++
  438. Routine name : CMainFrame::OnUpdateFolderItemsCount
  439. Routine description:
  440. status bar indication of folder items count
  441. Author:
  442. Alexander Malysh (AlexMay), Jan, 2000
  443. Arguments:
  444. pCmdUI [in/out]
  445. Return Value:
  446. None.
  447. --*/
  448. {
  449. CString cstrText;
  450. if(NULL != m_pLeftView)
  451. {
  452. int nItemCount = m_pLeftView->GetDataCount();
  453. //
  454. // if nItemCount < 0 this information is not relevant
  455. //
  456. if(nItemCount >= 0)
  457. {
  458. CString cstrFormat;
  459. DWORD dwRes = LoadResourceString (cstrFormat,
  460. (1 == nItemCount) ? IDS_STATUS_BAR_ITEM : IDS_STATUS_BAR_ITEMS);
  461. if (ERROR_SUCCESS != dwRes)
  462. {
  463. goto exit;
  464. }
  465. try
  466. {
  467. cstrText.Format(cstrFormat, nItemCount);
  468. }
  469. catch(...)
  470. {
  471. dwRes = ERROR_NOT_ENOUGH_MEMORY;
  472. goto exit;
  473. }
  474. }
  475. }
  476. exit:
  477. pCmdUI->SetText (cstrText);
  478. }
  479. void
  480. CMainFrame::OnStatusBarDblClk(
  481. NMHDR* pNotifyStruct,
  482. LRESULT* result
  483. )
  484. {
  485. POINT pt;
  486. GetCursorPos(&pt);
  487. CRect rc;
  488. m_wndStatusBar.GetItemRect(STATUS_PANE_ACTIVITY, &rc);
  489. m_wndStatusBar.ClientToScreen(&rc);
  490. if(rc.PtInRect(pt))
  491. {
  492. OnToolsServerStatus();
  493. }
  494. }
  495. void
  496. CMainFrame::OnUpdateActivity(
  497. CCmdUI* pCmdUI
  498. )
  499. {
  500. CString cstrText;
  501. HICON hIcon = NULL;
  502. if (!m_pLeftView)
  503. {
  504. //
  505. // No left view yet
  506. //
  507. return;
  508. }
  509. if (!m_pLeftView->GetActivity(cstrText, hIcon))
  510. {
  511. //
  512. // Activity string is to be ignored
  513. //
  514. cstrText.Empty ();
  515. }
  516. CStatusBarCtrl& barCtrl = m_wndStatusBar.GetStatusBarCtrl();
  517. barCtrl.SetIcon(STATUS_PANE_ACTIVITY, hIcon);
  518. pCmdUI->SetText (cstrText);
  519. }
  520. void
  521. CMainFrame::OnUpdateRefreshFolder(
  522. CCmdUI* pCmdUI
  523. )
  524. /*++
  525. Routine name : CMainFrame::OnUpdateRefreshFolder
  526. Routine description:
  527. Called by the framework to know if the current folder can be refreshed (F5)
  528. Author:
  529. Eran Yariv (EranY), Jan, 2000
  530. Arguments:
  531. pCmdUI [in] - Answer buffer
  532. Return Value:
  533. None.
  534. --*/
  535. {
  536. pCmdUI->Enable(GetLeftView()->CanRefreshFolder());
  537. }
  538. LRESULT
  539. CMainFrame::OnPopupError (
  540. WPARAM wParam,
  541. LPARAM lParam)
  542. /*++
  543. Routine name : CMainFrame::OnPopupError
  544. Routine description:
  545. Handles the WM_POPUP_ERROR messages
  546. Author:
  547. Eran Yariv (EranY), Jan, 2000
  548. Arguments:
  549. wParam [in] - Error code
  550. lParam [in] - Hiword contains the __FILE_ID__ and
  551. Loword contains the line number
  552. Return Value:
  553. Standard result code
  554. --*/
  555. {
  556. DWORD dwErrCode = (DWORD) wParam;
  557. WORD wFileId = HIWORD(DWORD(lParam));
  558. WORD wLineNumber = LOWORD(DWORD(lParam));
  559. CErrorDlg ErrDlg(dwErrCode, wFileId, wLineNumber);
  560. return ErrDlg.DoModal ();
  561. } // CMainFrame::OnPopupError
  562. LRESULT
  563. CMainFrame::OnSelectItem (
  564. WPARAM wParam,
  565. LPARAM lParam)
  566. /*++
  567. Routine name : CMainFrame::OnSelectItem
  568. Routine description:
  569. Handles the WM_CONSOLE_SELECT_ITEM messages
  570. Author:
  571. Eran Yariv (EranY), May, 2001
  572. Arguments:
  573. wParam [in] - Low 32-bits of message id
  574. lParam [in] - High 32-bits of message id
  575. Return Value:
  576. Standard result code
  577. --*/
  578. {
  579. DBG_ENTER(TEXT("CMainFrame::OnSelectItem"), TEXT("wParam=%ld, lParam=%ld"), wParam, lParam);
  580. ULARGE_INTEGER uli;
  581. uli.LowPart = wParam;
  582. uli.HighPart = lParam;
  583. if (!m_pLeftView)
  584. {
  585. return FALSE;
  586. }
  587. CFolderListView* pCurView = m_pLeftView->GetCurrentView();
  588. if (!pCurView)
  589. {
  590. return FALSE;
  591. }
  592. pCurView->SelectItemById(uli.QuadPart);
  593. return TRUE;
  594. } // CMainFrame::OnSelectItem
  595. LRESULT
  596. CMainFrame::OnSetActiveFolder (
  597. WPARAM wParam,
  598. LPARAM lParam)
  599. /*++
  600. Routine name : CMainFrame::OnSetActiveFolder
  601. Routine description:
  602. Handles the WM_CONSOLE_SET_ACTIVE_FOLDER messages
  603. Author:
  604. Eran Yariv (EranY), May, 2001
  605. Arguments:
  606. wParam [in] - FolderType value
  607. lParam [in] - Unused
  608. Return Value:
  609. Standard result code
  610. --*/
  611. {
  612. DBG_ENTER(TEXT("CMainFrame::OnSetActiveFolder"), TEXT("wParam=%ld, lParam=%ld"), wParam, lParam);
  613. if (wParam > FOLDER_TYPE_INCOMING)
  614. {
  615. VERBOSE (GENERAL_ERR, TEXT("wParam is out of range - message ignored"));
  616. return FALSE;
  617. }
  618. if (!m_pLeftView)
  619. {
  620. return FALSE;
  621. }
  622. m_pLeftView->SelectFolder (FolderType(wParam));
  623. return TRUE;
  624. } // CMainFrame::OnSetActiveFolder
  625. DWORD
  626. CMainFrame::CreateFolderViews (
  627. CDocument *pDoc
  628. )
  629. /*++
  630. Routine name : CMainFrame::CreateFolderViews
  631. Routine description:
  632. Creates the 4 global views used for folders display
  633. Author:
  634. Eran Yariv (EranY), Jan, 2000
  635. Arguments:
  636. pDoc [in] - Pointer to document to attach to the new views
  637. Return Value:
  638. Standard Win32 error code
  639. --*/
  640. {
  641. DWORD dwRes = ERROR_SUCCESS;
  642. DBG_ENTER(TEXT("CMainFrame::CreateFolderViews"), dwRes);
  643. DWORD dwChildID = AFX_IDW_PANE_FIRST + 10;
  644. ASSERTION (!m_pIncomingView && !m_pInboxView && !m_pSentItemsView && !m_pOutboxView);
  645. //
  646. // Create incoming view
  647. //
  648. dwRes = CreateDynamicView (dwChildID++,
  649. CLIENT_INCOMING_VIEW,
  650. RUNTIME_CLASS(CFolderListView),
  651. pDoc,
  652. (PINT)IncomingColumnsUsed,
  653. INCOMING_DEF_COL_NUM,
  654. (CFolderListView **)&m_pIncomingView,
  655. FOLDER_TYPE_INCOMING);
  656. if (ERROR_SUCCESS != dwRes)
  657. {
  658. CALL_FAIL (GENERAL_ERR, TEXT("CMainFrame::CreateDynamicView (Incoming)"), dwRes);
  659. return dwRes;
  660. }
  661. //
  662. // Create inbox view
  663. //
  664. dwRes = CreateDynamicView (dwChildID++,
  665. CLIENT_INBOX_VIEW,
  666. RUNTIME_CLASS(CFolderListView),
  667. pDoc,
  668. (PINT)InboxColumnsUsed,
  669. INBOX_DEF_COL_NUM,
  670. (CFolderListView **)&m_pInboxView,
  671. FOLDER_TYPE_INBOX);
  672. if (ERROR_SUCCESS != dwRes)
  673. {
  674. CALL_FAIL (GENERAL_ERR, TEXT("CMainFrame::CreateDynamicView (Inbox)"), dwRes);
  675. return dwRes;
  676. }
  677. //
  678. // Create SentItems view
  679. //
  680. dwRes = CreateDynamicView (dwChildID++,
  681. CLIENT_SENT_ITEMS_VIEW,
  682. RUNTIME_CLASS(CFolderListView),
  683. pDoc,
  684. (PINT)SentItemsColumnsUsed,
  685. SENT_ITEMS_DEF_COL_NUM,
  686. (CFolderListView **)&m_pSentItemsView,
  687. FOLDER_TYPE_SENT_ITEMS);
  688. if (ERROR_SUCCESS != dwRes)
  689. {
  690. CALL_FAIL (GENERAL_ERR, TEXT("CMainFrame::CreateDynamicView (SentItems)"), dwRes);
  691. return dwRes;
  692. }
  693. //
  694. // Create Outbox view
  695. //
  696. dwRes = CreateDynamicView (dwChildID++,
  697. CLIENT_OUTBOX_VIEW,
  698. RUNTIME_CLASS(CFolderListView),
  699. pDoc,
  700. (PINT)OutboxColumnsUsed,
  701. OUTBOX_DEF_COL_NUM,
  702. (CFolderListView **)&m_pOutboxView,
  703. FOLDER_TYPE_OUTBOX);
  704. if (ERROR_SUCCESS != dwRes)
  705. {
  706. CALL_FAIL (GENERAL_ERR, TEXT("CMainFrame::CreateDynamicView (Outbox)"), dwRes);
  707. return dwRes;
  708. }
  709. return dwRes;
  710. } // CMainFrame::CreateFolderViews
  711. DWORD
  712. CMainFrame::CreateDynamicView (
  713. DWORD dwChildId,
  714. LPCTSTR lpctstrName,
  715. CRuntimeClass* pViewClass,
  716. CDocument* pDoc,
  717. int* pColumnsUsed,
  718. DWORD dwDefaultColNum,
  719. CFolderListView** ppNewView,
  720. FolderType type
  721. )
  722. /*++
  723. Routine name : CMainFrame::CreateDynamicView
  724. Routine description:
  725. Creates a new view dynamically
  726. Author:
  727. Eran Yariv (EranY), Jan, 2000
  728. Arguments:
  729. dwChildId [in ] - New child id (within the splitter) of the view
  730. lpctstrName [in ] - Name of the view
  731. pViewClass [in ] - Class of the view
  732. pDoc [in ] - Pointer to document to attach to the new view
  733. pColumnsUsed [in ] - List of columns to use in the view
  734. dwDefaultColNum [in ] - default column number
  735. ppNewView [out] - Pointer to newly created view
  736. Return Value:
  737. Standard Win32 error code
  738. --*/
  739. {
  740. DWORD dwRes = ERROR_SUCCESS;
  741. DBG_ENTER(TEXT("CMainFrame::CreateDynamicView"), dwRes);
  742. ASSERTION (pDoc);
  743. CCreateContext contextT;
  744. contextT.m_pNewViewClass = pViewClass;
  745. contextT.m_pCurrentDoc = pDoc;
  746. contextT.m_pNewDocTemplate = pDoc->GetDocTemplate();
  747. contextT.m_pLastView = NULL;
  748. contextT.m_pCurrentFrame = NULL;
  749. try
  750. {
  751. *ppNewView = (CFolderListView*)(pViewClass->CreateObject());
  752. if (NULL == *ppNewView)
  753. {
  754. dwRes = ERROR_NOT_ENOUGH_MEMORY;
  755. CALL_FAIL (MEM_ERR, TEXT ("CRuntimeClass::CreateObject"), dwRes);
  756. return dwRes;
  757. }
  758. }
  759. catch (CException *pException)
  760. {
  761. TCHAR wszCause[1024];
  762. pException->GetErrorMessage (wszCause, 1024);
  763. pException->Delete ();
  764. VERBOSE (EXCEPTION_ERR,
  765. TEXT("CreateObject caused exception : %s"),
  766. wszCause);
  767. dwRes = ERROR_NOT_ENOUGH_MEMORY;
  768. return dwRes;
  769. }
  770. (*ppNewView)->SetType(type);
  771. ASSERT((*ppNewView)->m_hWnd == NULL); // Not yet created
  772. DWORD dwStyle = WS_CHILD | // Child window (of splitter)
  773. WS_BORDER | // Has borders
  774. LVS_REPORT | // Report style
  775. LVS_SHAREIMAGELISTS | // All views use one global image list
  776. LVS_SHOWSELALWAYS; // Always show selected items
  777. //
  778. // Create the view
  779. //
  780. CRect rect;
  781. if (!(*ppNewView)->Create(NULL,
  782. lpctstrName,
  783. dwStyle,
  784. rect,
  785. &m_wndSplitter,
  786. dwChildId,
  787. &contextT))
  788. {
  789. dwRes = ERROR_GEN_FAILURE;
  790. CALL_FAIL (WINDOW_ERR, TEXT("CFolderListView::Create"), dwRes);
  791. //
  792. // pWnd will be cleaned up by PostNcDestroy
  793. //
  794. return dwRes;
  795. }
  796. //
  797. // Init the columns
  798. //
  799. dwRes = (*ppNewView)->InitColumns (pColumnsUsed, dwDefaultColNum);
  800. if (ERROR_SUCCESS != dwRes)
  801. {
  802. CALL_FAIL (GENERAL_ERR, TEXT("CFolderListView::InitColumns"), dwRes);
  803. }
  804. dwRes = (*ppNewView)->ReadLayout(lpctstrName);
  805. if (ERROR_SUCCESS != dwRes)
  806. {
  807. CALL_FAIL (GENERAL_ERR, TEXT("CFolderListView::ReadLayout"), dwRes);
  808. }
  809. (*ppNewView)->ColumnsToLayout();
  810. return dwRes;
  811. } // CMainFrame::CreateDynamicView
  812. void
  813. CMainFrame::SaveLayout()
  814. /*++
  815. Routine name : CMainFrame::SaveLayout
  816. Routine description:
  817. saves windows layout to the registry
  818. Return Value:
  819. None.
  820. --*/
  821. {
  822. DBG_ENTER(TEXT("CMainFrame::SaveLayout"));
  823. DWORD dwRes = ERROR_SUCCESS;
  824. //
  825. // save folders layout
  826. //
  827. dwRes = m_pIncomingView->SaveLayout(CLIENT_INCOMING_VIEW);
  828. if (ERROR_SUCCESS != dwRes)
  829. {
  830. CALL_FAIL (GENERAL_ERR, TEXT("CFolderListView::SaveLayout"), dwRes);
  831. }
  832. dwRes = m_pInboxView->SaveLayout(CLIENT_INBOX_VIEW);
  833. if (ERROR_SUCCESS != dwRes)
  834. {
  835. CALL_FAIL (GENERAL_ERR, TEXT("CFolderListView::SaveLayout"), dwRes);
  836. }
  837. dwRes = m_pSentItemsView->SaveLayout(CLIENT_SENT_ITEMS_VIEW);
  838. if (ERROR_SUCCESS != dwRes)
  839. {
  840. CALL_FAIL (GENERAL_ERR, TEXT("CFolderListView::SaveLayout"), dwRes);
  841. }
  842. dwRes = m_pOutboxView->SaveLayout(CLIENT_OUTBOX_VIEW);
  843. if (ERROR_SUCCESS != dwRes)
  844. {
  845. CALL_FAIL (GENERAL_ERR, TEXT("CFolderListView::SaveLayout"), dwRes);
  846. }
  847. //
  848. // save main frame layout
  849. //
  850. WINDOWPLACEMENT wndpl;
  851. if(!GetWindowPlacement(&wndpl))
  852. {
  853. CALL_FAIL (WINDOW_ERR, TEXT("CMainFrame::GetWindowPlacement"), 0);
  854. }
  855. else
  856. {
  857. BOOL bRes = TRUE;
  858. bRes &= theApp.WriteProfileInt(CLIENT_MAIN_FRAME,
  859. CLIENT_MAXIMIZED,
  860. (SW_SHOWMAXIMIZED == wndpl.showCmd));
  861. bRes &= theApp.WriteProfileInt(CLIENT_MAIN_FRAME,
  862. CLIENT_NORMAL_POS_TOP,
  863. wndpl.rcNormalPosition.top);
  864. bRes &= theApp.WriteProfileInt(CLIENT_MAIN_FRAME,
  865. CLIENT_NORMAL_POS_RIGHT,
  866. wndpl.rcNormalPosition.right);
  867. bRes &= theApp.WriteProfileInt(CLIENT_MAIN_FRAME,
  868. CLIENT_NORMAL_POS_BOTTOM,
  869. wndpl.rcNormalPosition.bottom);
  870. bRes &= theApp.WriteProfileInt(CLIENT_MAIN_FRAME,
  871. CLIENT_NORMAL_POS_LEFT,
  872. wndpl.rcNormalPosition.left);
  873. int cxCur, cxMin;
  874. m_wndSplitter.GetColumnInfo(0, cxCur, cxMin);
  875. bRes &= theApp.WriteProfileInt(CLIENT_MAIN_FRAME, CLIENT_SPLITTER_POS, cxCur);
  876. if (!bRes)
  877. {
  878. VERBOSE (DBG_MSG, TEXT("Could not save one or more window positions"));
  879. }
  880. }
  881. }
  882. LRESULT
  883. CMainFrame::OnQueryEndSession(
  884. WPARAM,
  885. LPARAM
  886. )
  887. /*++
  888. Routine name : CMainFrame::OnQueryEndSession
  889. Routine description:
  890. The system shutdown message handler
  891. Saves windows layout to the registry
  892. Return Value:
  893. TRUE If the application can terminate conveniently
  894. FALSE otherwise
  895. --*/
  896. {
  897. DBG_ENTER(TEXT("CMainFrame::OnQueryEndSession"));
  898. SaveLayout();
  899. return TRUE;
  900. }
  901. void
  902. CMainFrame::OnClose()
  903. /*++
  904. Routine name : CMainFrame::OnClose
  905. Routine description:
  906. saves windows layout to the registry
  907. Author:
  908. Alexander Malysh (AlexMay), Jan, 2000
  909. Arguments:
  910. Return Value:
  911. None.
  912. --*/
  913. {
  914. DBG_ENTER(TEXT("CMainFrame::OnClose"));
  915. SaveLayout();
  916. CFrameWnd::OnClose();
  917. }
  918. void
  919. CMainFrame::FrameToSavedLayout()
  920. /*++
  921. Routine name : CMainFrame::FrameToSavedLayout
  922. Routine description:
  923. reads main frame size and position from registry and resize the window
  924. Author:
  925. Alexander Malysh (AlexMay), Jan, 2000
  926. Arguments:
  927. Return Value:
  928. None.
  929. --*/
  930. {
  931. DBG_ENTER(TEXT("CMainFrame::FrameToSavedLayout"));
  932. WINDOWPLACEMENT wndpl;
  933. if(!GetWindowPlacement(&wndpl))
  934. {
  935. CALL_FAIL (WINDOW_ERR, TEXT("CMainFrame::GetWindowPlacement"), 0);
  936. return;
  937. }
  938. wndpl.rcNormalPosition.top = theApp.GetProfileInt(CLIENT_MAIN_FRAME,
  939. CLIENT_NORMAL_POS_TOP, -1);
  940. wndpl.rcNormalPosition.right = theApp.GetProfileInt(CLIENT_MAIN_FRAME,
  941. CLIENT_NORMAL_POS_RIGHT, -1);
  942. wndpl.rcNormalPosition.bottom = theApp.GetProfileInt(CLIENT_MAIN_FRAME,
  943. CLIENT_NORMAL_POS_BOTTOM, -1);
  944. wndpl.rcNormalPosition.left = theApp.GetProfileInt(CLIENT_MAIN_FRAME,
  945. CLIENT_NORMAL_POS_LEFT, -1);
  946. if(wndpl.rcNormalPosition.top < 0 || wndpl.rcNormalPosition.right < 0 ||
  947. wndpl.rcNormalPosition.bottom < 0 || wndpl.rcNormalPosition.left < 0)
  948. {
  949. VERBOSE (DBG_MSG, TEXT("Could not load one or more window positions"));
  950. return;
  951. }
  952. if(!SetWindowPlacement(&wndpl))
  953. {
  954. CALL_FAIL (WINDOW_ERR, TEXT("CMainFrame::SetWindowPlacement"), 0);
  955. }
  956. }
  957. void
  958. CMainFrame::SplitterToSavedLayout()
  959. {
  960. DBG_ENTER(TEXT("CMainFrame::SplitterToSavedLayout"));
  961. //
  962. // set splitter position according to saved value
  963. //
  964. int xPos = theApp.GetProfileInt(CLIENT_MAIN_FRAME, CLIENT_SPLITTER_POS, -1);
  965. if(xPos < 0)
  966. {
  967. VERBOSE (DBG_MSG, TEXT("Could not load splitter position"));
  968. return;
  969. }
  970. m_wndSplitter.SetColumnInfo(0, xPos, 10);
  971. }
  972. void
  973. CMainFrame::ActivateFrame(
  974. int nCmdShow
  975. )
  976. {
  977. //
  978. // maximize according to saved value
  979. //
  980. BOOL bMaximized = theApp.GetProfileInt(CLIENT_MAIN_FRAME, CLIENT_MAXIMIZED, 0);
  981. if (bMaximized)
  982. {
  983. nCmdShow = SW_SHOWMAXIMIZED;
  984. }
  985. CFrameWnd::ActivateFrame(nCmdShow);
  986. }
  987. //
  988. // MAX_NUM_SERVERS is defined to limit the range of messages we consider
  989. // as server notification.
  990. //
  991. #define MAX_NUM_SERVERS 256
  992. LRESULT
  993. CMainFrame::WindowProc(
  994. UINT message,
  995. WPARAM wParam,
  996. LPARAM lParam
  997. )
  998. /*++
  999. Routine name : CMainFrame::WindowProc
  1000. Routine description:
  1001. Handle windows messages before MFC dispatches them.
  1002. Here we handle notification messages from the servers.
  1003. Author:
  1004. Eran Yariv (EranY), Jan, 2000
  1005. Arguments:
  1006. message [in] - Specifies the Windows message to be processed
  1007. wParam [in] -
  1008. lParam [in] -
  1009. Return Value:
  1010. TRUE if mesage was handled by the function, FALSE otherwise.
  1011. --*/
  1012. {
  1013. BOOL bRes = FALSE;
  1014. BOOL bBadMsg = FALSE;
  1015. if ((WM_SERVER_NOTIFY_BASE > message) ||
  1016. (WM_SERVER_NOTIFY_BASE + MAX_NUM_SERVERS < message))
  1017. {
  1018. //
  1019. // This is not a server notification message
  1020. //
  1021. return CFrameWnd::WindowProc(message, wParam, lParam);
  1022. }
  1023. //
  1024. // From now on, we're dealing with a server notification
  1025. //
  1026. DBG_ENTER(TEXT("CMainFrame::WindowProc"),
  1027. bRes,
  1028. TEXT("Msg=0x%08x, lParam=0x%08x, wParam=0x%08x"),
  1029. message,
  1030. lParam,
  1031. wParam);
  1032. //
  1033. // This message should not be processed any more
  1034. //
  1035. bRes = TRUE;
  1036. //
  1037. // Try looking up the server node for which this message is intended
  1038. //
  1039. CServerNode *pServer = CServerNode::LookupServerFromMessageId (message);
  1040. FAX_EVENT_EX *pEvent = (FAX_EVENT_EX *)(lParam);
  1041. ASSERTION (pEvent);
  1042. ASSERTION (sizeof (FAX_EVENT_EX) == pEvent->dwSizeOfStruct);
  1043. if (pServer)
  1044. {
  1045. //
  1046. // Tell the server a notification has arrived for it
  1047. //
  1048. VERBOSE (DBG_MSG, TEXT("Message was coming from %s"), pServer->Machine());
  1049. try
  1050. {
  1051. //
  1052. // Protect against bogus messages
  1053. //
  1054. DWORD dwRes = pServer->OnNotificationMessage (pEvent);
  1055. if (ERROR_SUCCESS != dwRes)
  1056. {
  1057. CALL_FAIL (GENERAL_ERR, TEXT("CServerNode::OnNotificationMessage"), dwRes);
  1058. }
  1059. }
  1060. catch (...)
  1061. {
  1062. bBadMsg = TRUE;
  1063. }
  1064. }
  1065. else
  1066. {
  1067. VERBOSE (DBG_MSG, TEXT("Got server notification - No server found as sink"));
  1068. }
  1069. //
  1070. // Processed or not - delete the message
  1071. //
  1072. if (!bBadMsg)
  1073. {
  1074. try
  1075. {
  1076. //
  1077. // Protect against bogus messages
  1078. // ... and ...
  1079. // Plant a special value here to catch reuse of the same pointer
  1080. //
  1081. pEvent->dwSizeOfStruct = 0xbabe;
  1082. FaxFreeBuffer (pEvent);
  1083. }
  1084. catch (...)
  1085. {
  1086. bBadMsg = TRUE;
  1087. }
  1088. }
  1089. if (bBadMsg)
  1090. {
  1091. VERBOSE (GENERAL_ERR, TEXT("Exception while processing windows message as notification"));
  1092. ASSERTION_FAILURE;
  1093. }
  1094. return bRes;
  1095. } // CMainFrame::WindowProc
  1096. void
  1097. CMainFrame::OnToolsAdminConsole()
  1098. {
  1099. DBG_ENTER(TEXT("CMainFrame::OnToolsAdminConsole"));
  1100. InvokeServiceManager(m_hWnd, GetResourceHandle(), IDS_ADMIN_CONSOLE_TITLE);
  1101. }
  1102. void
  1103. CMainFrame::OnToolsConfigWizard()
  1104. /*++
  1105. Routine name : CMainFrame::OnToolsConfigWizard
  1106. Routine description:
  1107. Fax Configuration Wizard invocation
  1108. Return Value:
  1109. none
  1110. --*/
  1111. {
  1112. DBG_ENTER(TEXT("CMainFrame::OnToolsConfigWizard"));
  1113. //
  1114. // explicit launch
  1115. //
  1116. theApp.LaunchConfigWizard(TRUE);
  1117. }
  1118. void
  1119. CMainFrame::OnToolsMonitor()
  1120. /*++
  1121. Routine name : CMainFrame::OnToolsMonitor
  1122. Routine description:
  1123. Open Fax Monitor dialog
  1124. Return Value:
  1125. none
  1126. --*/
  1127. {
  1128. DBG_ENTER(TEXT("CMainFrame::OnToolsMonitor"));
  1129. HWND hWndFaxMon = ::FindWindow(FAXSTAT_WINCLASS, NULL);
  1130. if (hWndFaxMon)
  1131. {
  1132. ::PostMessage(hWndFaxMon, WM_FAXSTAT_OPEN_MONITOR, 0, 0);
  1133. }
  1134. }
  1135. void
  1136. CMainFrame::OnToolsFaxPrinterProps()
  1137. /*++
  1138. Routine name : CMainFrame::OnToolsFaxPrinterProps
  1139. Routine description:
  1140. Open Fax Printer Properties dialog
  1141. Return Value:
  1142. none
  1143. --*/
  1144. {
  1145. DBG_ENTER(TEXT("CMainFrame::OnToolsMonitor"));
  1146. //
  1147. // Open fax printer properties
  1148. //
  1149. FaxPrinterProperty(0);
  1150. }
  1151. void
  1152. CMainFrame::OnUpdateWindowsXPTools(
  1153. CCmdUI* pCmdUI
  1154. )
  1155. /*++
  1156. Routine name : CMainFrame::OnToolsConfigWizard
  1157. Routine description:
  1158. Delete Fax Configuration Wizard and Admin Console
  1159. menu items for non Windows XP plarform
  1160. Return Value:
  1161. none
  1162. --*/
  1163. {
  1164. DBG_ENTER(TEXT("CMainFrame::OnUpdateConfigWizard"));
  1165. if(pCmdUI->m_pMenu)
  1166. {
  1167. if(!IsWinXPOS())
  1168. {
  1169. pCmdUI->m_pMenu->DeleteMenu(ID_TOOLS_CONFIG_WIZARD, MF_BYCOMMAND);
  1170. pCmdUI->m_pMenu->DeleteMenu(ID_TOOLS_ADMIN_CONSOLE, MF_BYCOMMAND);
  1171. pCmdUI->m_pMenu->DeleteMenu(ID_TOOLS_MONITOR, MF_BYCOMMAND);
  1172. pCmdUI->m_pMenu->DeleteMenu(ID_TOOLS_FAX_PRINTER_PROPS, MF_BYCOMMAND);
  1173. }
  1174. else
  1175. {
  1176. //
  1177. // Windows XP OS - check SKU
  1178. //
  1179. if (IsDesktopSKU() || !IsFaxComponentInstalled(FAX_COMPONENT_ADMIN))
  1180. {
  1181. pCmdUI->m_pMenu->DeleteMenu(ID_TOOLS_ADMIN_CONSOLE, MF_BYCOMMAND);
  1182. }
  1183. if(!IsFaxComponentInstalled(FAX_COMPONENT_CONFIG_WZRD))
  1184. {
  1185. pCmdUI->m_pMenu->DeleteMenu(ID_TOOLS_CONFIG_WIZARD, MF_BYCOMMAND);
  1186. }
  1187. if(!IsFaxComponentInstalled(FAX_COMPONENT_MONITOR))
  1188. {
  1189. pCmdUI->m_pMenu->DeleteMenu(ID_TOOLS_MONITOR, MF_BYCOMMAND);
  1190. }
  1191. //
  1192. // Local fax printer properties
  1193. //
  1194. CClientConsoleDoc* pDoc = (CClientConsoleDoc*)GetActiveDocument();
  1195. if(NULL == pDoc)
  1196. {
  1197. ASSERTION_FAILURE;
  1198. return;
  1199. }
  1200. //
  1201. // Find local fax server
  1202. // if it is not installed disable the menu item
  1203. //
  1204. if(!pDoc->FindServerByName(NULL) || !IsFaxComponentInstalled(FAX_COMPONENT_DRIVER_UI))
  1205. {
  1206. pCmdUI->m_pMenu->DeleteMenu(ID_TOOLS_FAX_PRINTER_PROPS, MF_BYCOMMAND);
  1207. }
  1208. }
  1209. if(pCmdUI->m_pMenu->GetMenuItemCount() == 4)
  1210. {
  1211. //
  1212. // delete the menu separator
  1213. //
  1214. pCmdUI->m_pMenu->DeleteMenu(3, MF_BYPOSITION);
  1215. }
  1216. }
  1217. }
  1218. void
  1219. CMainFrame::OnUpdateSendNewFax(
  1220. CCmdUI* pCmdUI
  1221. )
  1222. {
  1223. BOOL bEnable = FALSE;
  1224. CClientConsoleDoc* pDoc = (CClientConsoleDoc*)GetActiveDocument();
  1225. if(NULL != pDoc)
  1226. {
  1227. bEnable = pDoc->IsSendFaxEnable();
  1228. }
  1229. pCmdUI->Enable(bEnable);
  1230. }
  1231. void
  1232. CMainFrame::OnUpdateReceiveNewFax(
  1233. CCmdUI* pCmdUI
  1234. )
  1235. {
  1236. BOOL bEnable = FALSE;
  1237. if (IsWinXPOS ())
  1238. {
  1239. //
  1240. // Receive now works only in Windows XP
  1241. //
  1242. CClientConsoleDoc* pDoc = (CClientConsoleDoc*)GetActiveDocument();
  1243. if(NULL != pDoc)
  1244. {
  1245. bEnable = pDoc->CanReceiveNow();
  1246. }
  1247. }
  1248. pCmdUI->Enable(bEnable);
  1249. }
  1250. void
  1251. CMainFrame::OnReceiveNewFax()
  1252. /*++
  1253. Routine name : CMainFrame::OnReceiveNewFax
  1254. Routine description:
  1255. Starts receiving now
  1256. Author:
  1257. Eran Yariv (EranY). Mar, 2001
  1258. Arguments:
  1259. Return Value:
  1260. None.
  1261. --*/
  1262. {
  1263. DBG_ENTER(TEXT("CMainFrame::OnReceiveNewFax"));
  1264. HWND hWndFaxMon = ::FindWindow(FAXSTAT_WINCLASS, NULL);
  1265. if (hWndFaxMon)
  1266. {
  1267. ::PostMessage(hWndFaxMon, WM_FAXSTAT_RECEIVE_NOW, 0, 0);
  1268. }
  1269. } // CMainFrame::OnReceiveNewFax
  1270. void
  1271. CMainFrame::OnSendNewFax()
  1272. /*++
  1273. Routine name : CMainFrame::OnSendNewFax
  1274. Routine description:
  1275. start send fax wizard
  1276. Author:
  1277. Alexander Malysh (AlexMay), Feb, 2000
  1278. Arguments:
  1279. Return Value:
  1280. None.
  1281. --*/
  1282. {
  1283. DWORD dwRes = ERROR_SUCCESS;
  1284. DBG_ENTER(TEXT("CMainFrame::OnSendNewFax"));
  1285. //
  1286. // get send fax wizard location
  1287. //
  1288. CString cstrFaxSend;
  1289. dwRes = GetAppLoadPath(cstrFaxSend);
  1290. if(ERROR_SUCCESS != dwRes)
  1291. {
  1292. PopupError(dwRes);
  1293. CALL_FAIL (GENERAL_ERR, TEXT("GetAppLoadPath"), dwRes);
  1294. return;
  1295. }
  1296. try
  1297. {
  1298. cstrFaxSend += FAX_SEND_IMAGE_NAME;
  1299. }
  1300. catch(...)
  1301. {
  1302. dwRes = ERROR_NOT_ENOUGH_MEMORY;
  1303. PopupError(dwRes);
  1304. CALL_FAIL (MEM_ERR, TEXT("CString::operator+"), dwRes);
  1305. return ;
  1306. }
  1307. //
  1308. // start send fax wizard
  1309. //
  1310. HINSTANCE hWizard = ShellExecute(NULL,
  1311. TEXT("open"),
  1312. cstrFaxSend,
  1313. NULL,
  1314. NULL,
  1315. SW_RESTORE
  1316. );
  1317. if((DWORD_PTR)hWizard <= 32)
  1318. {
  1319. //
  1320. // error
  1321. //
  1322. dwRes = PtrToUlong(hWizard);
  1323. PopupError(dwRes);
  1324. CALL_FAIL (GENERAL_ERR, TEXT("ShellExecute"), dwRes);
  1325. return;
  1326. }
  1327. } // CMainFrame::OnSendNewFax
  1328. void
  1329. CMainFrame::OnViewOptions()
  1330. {
  1331. DBG_ENTER(TEXT("CMainFrame::OnViewOptions"));
  1332. CUserInfoDlg userInfo;
  1333. if(userInfo.DoModal() == IDABORT)
  1334. {
  1335. DWORD dwRes = userInfo.GetLastDlgError();
  1336. CALL_FAIL (GENERAL_ERR, TEXT("CUserInfoDlg::DoModal"), dwRes);
  1337. PopupError(dwRes);
  1338. }
  1339. }
  1340. void
  1341. CMainFrame::OnToolsCoverPages()
  1342. {
  1343. DBG_ENTER(TEXT("CMainFrame::OnToolsCoverPages"));
  1344. CCoverPagesDlg cpDlg;
  1345. if(cpDlg.DoModal() == IDABORT)
  1346. {
  1347. DWORD dwRes = cpDlg.GetLastDlgError();
  1348. CALL_FAIL (GENERAL_ERR, TEXT("CCoverPagesDlg::DoModal"), dwRes);
  1349. PopupError(dwRes);
  1350. }
  1351. }
  1352. void
  1353. CMainFrame::OnSettingChange(
  1354. UINT uFlags,
  1355. LPCTSTR lpszSection
  1356. )
  1357. {
  1358. DWORD dwRes = ERROR_SUCCESS;
  1359. DBG_ENTER(TEXT("CMainFrame::OnSettingChange"));
  1360. CFrameWnd::OnSettingChange(uFlags, lpszSection);
  1361. if(lpszSection && !_tcscmp(lpszSection, TEXT("devices")))
  1362. {
  1363. //
  1364. // some change in the system devices
  1365. //
  1366. CClientConsoleDoc* pDoc = (CClientConsoleDoc*)GetActiveDocument();
  1367. if(NULL != pDoc)
  1368. {
  1369. dwRes = pDoc->RefreshServersList();
  1370. if(ERROR_SUCCESS != dwRes)
  1371. {
  1372. CALL_FAIL (GENERAL_ERR, TEXT("CClientConsoleDoc::RefreshServersList"), dwRes);
  1373. }
  1374. }
  1375. }
  1376. } // CMainFrame::OnSettingChange
  1377. LONG
  1378. CMainFrame::OnHelp(
  1379. UINT wParam,
  1380. LONG lParam
  1381. )
  1382. /*++
  1383. Routine name : CMainFrame::OnHelp
  1384. Routine description:
  1385. F1 key handler
  1386. Author:
  1387. Alexander Malysh (AlexMay), Mar, 2000
  1388. Arguments:
  1389. wParam [in] -
  1390. lParam [in] - LPHELPINFO
  1391. Return Value:
  1392. LONG
  1393. --*/
  1394. {
  1395. DWORD dwRes = ERROR_SUCCESS;
  1396. DBG_ENTER(TEXT("CMainFrame::OnHelp"));
  1397. if(!IsFaxComponentInstalled(FAX_COMPONENT_HELP_CLIENT_CHM))
  1398. {
  1399. //
  1400. // The help file is not installed
  1401. //
  1402. return TRUE;
  1403. }
  1404. if(NULL != m_pLeftView)
  1405. {
  1406. dwRes = m_pLeftView->OpenHelpTopic();
  1407. if(ERROR_SUCCESS != dwRes)
  1408. {
  1409. CALL_FAIL (GENERAL_ERR, TEXT("CLeftView::OpenHelpTopic"),dwRes);
  1410. }
  1411. }
  1412. else
  1413. {
  1414. OnHelpContents();
  1415. }
  1416. return TRUE;
  1417. }
  1418. void
  1419. CMainFrame::OnUpdateHelpContents(CCmdUI* pCmdUI)
  1420. {
  1421. pCmdUI->Enable(IsFaxComponentInstalled(FAX_COMPONENT_HELP_CLIENT_CHM));
  1422. }
  1423. void
  1424. CMainFrame::OnHelpContents()
  1425. /*++
  1426. Routine name : CMainFrame::OnHelpContents
  1427. Routine description:
  1428. Help Contents menu item handler
  1429. Author:
  1430. Alexander Malysh (AlexMay), Mar, 2000
  1431. Arguments:
  1432. Return Value:
  1433. None.
  1434. --*/
  1435. {
  1436. DWORD dwRes = ERROR_SUCCESS;
  1437. DBG_ENTER(TEXT("CMainFrame::OnHelpContents"));
  1438. dwRes = ::HtmlHelpTopic(m_hWnd, FAX_HELP_WELCOME);
  1439. if(ERROR_SUCCESS != dwRes)
  1440. {
  1441. CALL_FAIL (GENERAL_ERR, TEXT("HtmlHelpTopic"),dwRes);
  1442. }
  1443. }
  1444. void
  1445. CMainFrame::OnUpdateServerStatus(
  1446. CCmdUI* pCmdUI
  1447. )
  1448. {
  1449. BOOL bEnable = FALSE;
  1450. CClientConsoleDoc* pDoc = (CClientConsoleDoc*)GetActiveDocument();
  1451. if(NULL != pDoc)
  1452. {
  1453. bEnable = pDoc->GetServerCount() > 0;
  1454. }
  1455. pCmdUI->Enable(bEnable);
  1456. }
  1457. void
  1458. CMainFrame::OnToolsServerStatus()
  1459. {
  1460. DBG_ENTER(TEXT("CMainFrame::OnToolsServerStatus"));
  1461. CClientConsoleDoc* pDoc = (CClientConsoleDoc*)GetActiveDocument();
  1462. if(pDoc->GetServerCount() == 0)
  1463. {
  1464. //
  1465. // no fax printer install
  1466. //
  1467. return;
  1468. }
  1469. CServerStatusDlg srvStatus(pDoc);
  1470. if(srvStatus.DoModal() == IDABORT)
  1471. {
  1472. DWORD dwRes = srvStatus.GetLastDlgError();
  1473. CALL_FAIL (GENERAL_ERR, TEXT("CServerStatusDlg::DoModal"), dwRes);
  1474. PopupError(dwRes);
  1475. }
  1476. }
  1477. void
  1478. CMainFrame::OnImportSentItems()
  1479. {
  1480. ImportArchive(TRUE);
  1481. }
  1482. void
  1483. CMainFrame::OnImportInbox()
  1484. {
  1485. ImportArchive(FALSE);
  1486. }
  1487. void
  1488. CMainFrame::ImportArchive(
  1489. BOOL bSentArch
  1490. )
  1491. /*++
  1492. Routine name : CMainFrame::ImportArchive
  1493. Routine description:
  1494. Import W2K MS faxes into the fax archive
  1495. Arguments:
  1496. bSentArch - [in] TRUE for Sent Items, FALSE for Inbox
  1497. Return Value:
  1498. None.
  1499. --*/
  1500. {
  1501. DWORD dwRes = ERROR_SUCCESS;
  1502. DBG_ENTER(TEXT("CMainFrame::ImportArchive"));
  1503. #ifdef UNICODE
  1504. HKEY hRegKey;
  1505. DWORD dwSize;
  1506. DWORD dwFlags = 0;
  1507. WCHAR* pszFolder = NULL;
  1508. CFolderDialog dlgFolder;
  1509. //
  1510. // Read initial import folder
  1511. //
  1512. if ((hRegKey = OpenRegistryKey(HKEY_LOCAL_MACHINE, REGKEY_FAX_SETUP, TRUE, KEY_QUERY_VALUE)))
  1513. {
  1514. if(bSentArch)
  1515. {
  1516. pszFolder = GetRegistryString(hRegKey, REGVAL_W2K_SENT_ITEMS, NULL);
  1517. }
  1518. else
  1519. {
  1520. pszFolder = GetRegistryStringMultiSz(hRegKey, REGVAL_W2K_INBOX, NULL, &dwSize);
  1521. }
  1522. RegCloseKey(hRegKey);
  1523. }
  1524. else
  1525. {
  1526. CALL_FAIL(GENERAL_ERR, TEXT("OpenRegistryKey"), GetLastError());
  1527. }
  1528. dwRes = dlgFolder.Init(pszFolder, bSentArch ? IDS_IMPORT_TITLE_SENTITEMS : IDS_IMPORT_TITLE_INBOX);
  1529. if(ERROR_SUCCESS != dwRes)
  1530. {
  1531. CALL_FAIL(GENERAL_ERR, TEXT("CMainFrame::ImportArchive"), dwRes);
  1532. goto exit;
  1533. }
  1534. //
  1535. // Display Browse for folder dialog
  1536. //
  1537. if (IsWinXPOS())
  1538. {
  1539. //
  1540. // The new BIF_NONEWFOLDERBUTTON is only defined for WinXP and above
  1541. //
  1542. dwFlags = BIF_NONEWFOLDERBUTTON;
  1543. }
  1544. if(IDOK != dlgFolder.DoModal(dwFlags))
  1545. {
  1546. goto exit;
  1547. }
  1548. //
  1549. // Import the selected folder
  1550. //
  1551. dwRes = ImportArchiveFolderUI(dlgFolder.GetSelectedFolder(), bSentArch, m_hWnd);
  1552. if(ERROR_SUCCESS != dwRes)
  1553. {
  1554. CALL_FAIL(GENERAL_ERR, TEXT("ImportArchiveFolderUI"), dwRes);
  1555. }
  1556. exit:
  1557. MemFree(pszFolder);
  1558. #endif // UNICODE
  1559. }
  1560. void
  1561. CMainFrame::OnUpdateImportSent(CCmdUI* pCmdUI)
  1562. {
  1563. if(pCmdUI->m_pMenu)
  1564. {
  1565. if(!IsWinXPOS())
  1566. {
  1567. //
  1568. // Delete the Import menu item and separator for non Windows XP OS
  1569. //
  1570. pCmdUI->m_pMenu->DeleteMenu(15, MF_BYPOSITION);
  1571. pCmdUI->m_pMenu->DeleteMenu(14, MF_BYPOSITION);
  1572. }
  1573. }
  1574. }
  1575. afx_msg void
  1576. CMainFrame::OnSysColorChange()
  1577. {
  1578. //
  1579. // Refresh the image lists we use - force it to refresh
  1580. // Since the image list are static FolderListView members (shared between all instances),
  1581. // we just pick any instance and call it's refresh function with bForce=TRUE.
  1582. //
  1583. if (m_pIncomingView)
  1584. {
  1585. m_pIncomingView->RefreshImageLists(TRUE);
  1586. m_pIncomingView->Invalidate ();
  1587. }
  1588. if (m_pInboxView)
  1589. {
  1590. m_pInboxView->RefreshImageLists(FALSE);
  1591. m_pInboxView->Invalidate ();
  1592. }
  1593. if (m_pSentItemsView)
  1594. {
  1595. m_pSentItemsView->RefreshImageLists(FALSE);
  1596. m_pSentItemsView->Invalidate ();
  1597. }
  1598. if (m_pOutboxView)
  1599. {
  1600. m_pOutboxView->RefreshImageLists(FALSE);
  1601. m_pOutboxView->Invalidate ();
  1602. }
  1603. if (m_pLeftView)
  1604. {
  1605. m_pLeftView->RefreshImageList ();
  1606. m_pLeftView->Invalidate();
  1607. }
  1608. if (m_pInitialRightPaneView)
  1609. {
  1610. m_pInitialRightPaneView->GetListCtrl().SetBkColor(::GetSysColor(COLOR_WINDOW));
  1611. }
  1612. } // CMainFrame::OnSysColorChange