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.

605 lines
17 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1998.
  5. //
  6. // File: schdsync.cpp
  7. //
  8. // Contents: SyncMgr AutoSync class
  9. //
  10. // Classes: CSchedSyncPage
  11. //
  12. // Notes:
  13. //
  14. // History: 14-Nov-97 SusiA Created.
  15. //
  16. //--------------------------------------------------------------------------
  17. #include "precomp.h"
  18. DWORD StartScheduler();
  19. extern HINSTANCE g_hmodThisDll; // Handle to this DLL itself.
  20. extern LANGID g_LangIdSystem; // LangId of system we are running on.
  21. #define UNLIMITED_SCHEDULE_COUNT 50 //Review: What is a reasonable amount of shcedules to grab at a time
  22. #define MAX_APPEND_STRING_LEN 32
  23. //+-------------------------------------------------------------------------------
  24. //
  25. // FUNCTION: BOOL CSchedSyncPage::Initialize()
  26. //
  27. // PURPOSE: initialization for the autosync page
  28. //
  29. // RETURN VALUE: return TRUE if we process it ok.
  30. //
  31. //+-------------------------------------------------------------------------------
  32. BOOL CSchedSyncPage::Initialize()
  33. {
  34. //initialize the item list
  35. HWND hwndList = GetDlgItem(m_hwnd,IDC_SCHEDLIST);
  36. TCHAR pszColumnTitle[MAX_PATH + 1];
  37. LV_COLUMN columnInfo;
  38. HIMAGELIST himage;
  39. INT iItem = -1;
  40. UINT ImageListflags;
  41. LoadString(m_hinst, IDS_SCHEDULE_COLUMN_TITLE, pszColumnTitle, ARRAYSIZE(pszColumnTitle));
  42. ListView_SetExtendedListViewStyle(hwndList, LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP );
  43. ImageListflags = ILC_COLOR | ILC_MASK;
  44. if (IsHwndRightToLeft(m_hwnd))
  45. {
  46. ImageListflags |= ILC_MIRROR;
  47. }
  48. // create an imagelist
  49. himage = ImageList_Create( GetSystemMetrics(SM_CXSMICON),
  50. GetSystemMetrics(SM_CYSMICON),ImageListflags,5,20);
  51. if (himage)
  52. {
  53. ListView_SetImageList(hwndList,himage,LVSIL_SMALL);
  54. }
  55. HICON hIcon = LoadIcon(m_hinst,MAKEINTRESOURCE(IDI_TASKSCHED));
  56. if (hIcon)
  57. {
  58. m_iDefaultIconImageIndex = ImageList_AddIcon(himage,hIcon);
  59. }
  60. else
  61. {
  62. m_iDefaultIconImageIndex = -1;
  63. }
  64. // Insert the Proper columns
  65. columnInfo.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
  66. columnInfo.fmt = LVCFMT_LEFT;
  67. columnInfo.cx = 328;
  68. columnInfo.pszText = pszColumnTitle;
  69. columnInfo.cchTextMax = lstrlen(pszColumnTitle) + 1;
  70. columnInfo.iSubItem = 0;
  71. ListView_InsertColumn(hwndList,0,&columnInfo);
  72. if (FAILED(InitializeScheduleAgent()))
  73. {
  74. return FALSE;
  75. }
  76. ShowAllSchedules();
  77. ShowWindow(m_hwnd, /* nCmdShow */ SW_SHOWNORMAL );
  78. UpdateWindow(m_hwnd);
  79. return TRUE;
  80. }
  81. //+-------------------------------------------------------------------------------
  82. //
  83. // FUNCTION: BOOL CSchedSyncPage::InitializeScheduleAgent()
  84. //
  85. // PURPOSE: initialization for the ISyncSCheduleMgr
  86. //
  87. // RETURN VALUE: return the appropriate HRESULT.
  88. //
  89. //+-------------------------------------------------------------------------------
  90. HRESULT CSchedSyncPage::InitializeScheduleAgent()
  91. {
  92. HRESULT hr;
  93. LPUNKNOWN lpUnk;
  94. m_pISyncSchedMgr = NULL;
  95. hr = CoCreateInstance(CLSID_SyncMgr,NULL,CLSCTX_INPROC_SERVER,
  96. IID_ISyncScheduleMgr,(void **) &lpUnk);
  97. if (NOERROR == hr)
  98. {
  99. hr = lpUnk->QueryInterface(IID_ISyncScheduleMgr,
  100. (void **) &m_pISyncSchedMgr);
  101. lpUnk->Release();
  102. }
  103. return hr;
  104. }
  105. //+-------------------------------------------------------------------------------
  106. //
  107. // FUNCTION: BOOL CSchedSyncPage::ShowAllSchedules()
  108. //
  109. // PURPOSE: initialization for the schedsync page
  110. //
  111. // RETURN VALUE: return TRUE if we process it ok.
  112. //
  113. //+-------------------------------------------------------------------------------
  114. BOOL CSchedSyncPage::ShowAllSchedules()
  115. {
  116. HRESULT hr;
  117. BOOL fResult = FALSE;
  118. IEnumSyncSchedules *pEnum = NULL;
  119. int iItem = -1;
  120. DWORD dwFetched;
  121. HWND hwndListView = GetDlgItem(m_hwnd,IDC_SCHEDLIST);
  122. SYNCSCHEDULECOOKIE SyncScheduleCookie;
  123. if (!m_pISyncSchedMgr || !hwndListView)
  124. {
  125. goto errRtn;
  126. }
  127. //First clear out the list
  128. FreeAllSchedules();
  129. ListView_DeleteAllItems(hwndListView);
  130. if (FAILED(hr = m_pISyncSchedMgr->EnumSyncSchedules(&pEnum)))
  131. {
  132. goto errRtn;
  133. }
  134. while(S_OK == pEnum->Next(1,&SyncScheduleCookie, &dwFetched))
  135. {
  136. ISyncSchedule *pISyncSched;
  137. WCHAR pwszName[MAX_PATH + 1];
  138. DWORD cchName = ARRAYSIZE(pwszName);
  139. LV_ITEM lvItem;
  140. //get the ISyncSched for this schedule
  141. if (FAILED(hr = m_pISyncSchedMgr->OpenSchedule(&SyncScheduleCookie,
  142. 0,&pISyncSched)))
  143. {
  144. //can't find this one in the registry - move on.
  145. continue;
  146. }
  147. //Get and convert the schedules friendly name
  148. if (FAILED(hr = pISyncSched->GetScheduleName(&cchName,pwszName)))
  149. {
  150. goto errRtn;
  151. }
  152. ++iItem;
  153. ZeroMemory(&lvItem, sizeof(lvItem));
  154. lvItem.mask = LVIF_TEXT | LVIF_PARAM;
  155. lvItem.pszText = pwszName;
  156. if (m_iDefaultIconImageIndex >= 0)
  157. {
  158. lvItem.mask |= LVIF_IMAGE;
  159. lvItem.iImage = m_iDefaultIconImageIndex;
  160. }
  161. //Save the ISyncSched pointer in the list view data
  162. lvItem.lParam = (LPARAM)pISyncSched;
  163. //add the item to the list
  164. ListView_InsertItem(hwndListView, &lvItem);
  165. }
  166. if (iItem != -1)
  167. {
  168. ListView_SetItemState(hwndListView, 0,
  169. LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
  170. }
  171. fResult = TRUE;
  172. errRtn:
  173. if (pEnum)
  174. {
  175. pEnum->Release();
  176. }
  177. return fResult;
  178. }
  179. //+-------------------------------------------------------------------------------
  180. //
  181. // FUNCTION: BOOL CSchedSyncPage::FreeAllSchedules()
  182. //
  183. // PURPOSE: free the schedules for the schedsync page
  184. //
  185. // RETURN VALUE: return TRUE if we process it ok.
  186. //
  187. //+-------------------------------------------------------------------------------
  188. BOOL CSchedSyncPage::FreeAllSchedules()
  189. {
  190. int iItem;
  191. int iItemCount;
  192. HWND hwndListView = GetDlgItem(m_hwnd,IDC_SCHEDLIST);
  193. iItemCount = ListView_GetItemCount(hwndListView);
  194. for(iItem = 0; iItem < iItemCount; iItem++)
  195. {
  196. ISyncSchedule *pISyncSched;
  197. LV_ITEM lvItem;
  198. ZeroMemory(&lvItem, sizeof(lvItem));
  199. lvItem.mask = LVIF_PARAM;
  200. lvItem.iItem = iItem;
  201. ListView_GetItem(hwndListView, &lvItem);
  202. pISyncSched = (ISyncSchedule *) lvItem.lParam;
  203. if (pISyncSched)
  204. {
  205. DWORD cRefs;
  206. cRefs = pISyncSched->Release();
  207. Assert(0 == cRefs);
  208. }
  209. }
  210. return TRUE;
  211. }
  212. //-----------------------------------------------------------------------------
  213. //
  214. // FUNCTION: CSchedSyncPage::OnNotify(HWND hwnd, int idFrom, LPNMHDR pnmhdr)
  215. //
  216. // PURPOSE: Handle the various notification messages dispatched from schedule
  217. // page
  218. //
  219. //-----------------------------------------------------------------------------
  220. BOOL CSchedSyncPage::OnNotify(HWND hwnd, int idFrom, LPNMHDR pnmhdr)
  221. {
  222. if (IDC_SCHEDLIST == idFrom)
  223. {
  224. switch (pnmhdr->code)
  225. {
  226. case LVN_ITEMCHANGED:
  227. {
  228. NM_LISTVIEW *pnmv = (NM_LISTVIEW FAR *) pnmhdr;
  229. if ( (pnmv->uChanged == LVIF_STATE) &&
  230. ((pnmv->uNewState ^ pnmv->uOldState) & LVIS_SELECTED))
  231. {
  232. BOOL fEnable = FALSE;
  233. if (pnmv->uNewState & LVIS_SELECTED)
  234. {
  235. fEnable = TRUE;
  236. }
  237. SetButtonState(IDC_SCHEDREMOVE,fEnable);
  238. SetButtonState(IDC_SCHEDEDIT,fEnable);
  239. return TRUE;
  240. }
  241. }
  242. break;
  243. case NM_DBLCLK:
  244. {
  245. LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW) pnmhdr;
  246. EditTask(lpnmlv->iItem);
  247. }
  248. break;
  249. case NM_RETURN:
  250. {
  251. LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW) pnmhdr;
  252. EditTask(lpnmlv->iItem);
  253. }
  254. break;
  255. default:
  256. break;
  257. }
  258. }
  259. return FALSE;
  260. }
  261. BOOL CSchedSyncPage::SetButtonState(int nIDDlgItem,BOOL fEnabled)
  262. {
  263. BOOL fResult = FALSE;
  264. HWND hwndCtrl = GetDlgItem(m_hwnd,nIDDlgItem);
  265. HWND hwndFocus = NULL;
  266. if (hwndCtrl)
  267. {
  268. if (!fEnabled) // don't bother getting focus if not disabling.
  269. {
  270. hwndFocus = GetFocus();
  271. }
  272. fResult = EnableWindow(GetDlgItem(m_hwnd,nIDDlgItem),fEnabled);
  273. // if control had the focus. and now it doesn't then tab to the
  274. // next control
  275. if (hwndFocus == hwndCtrl
  276. && !fEnabled)
  277. {
  278. SetFocus(GetDlgItem(m_hwnd,IDC_SCHEDADD)); // if need to change focus set to add.
  279. }
  280. }
  281. return fResult;
  282. }
  283. BOOL CSchedSyncPage::OnCommand(HWND hDlg, WORD wNotifyCode, WORD wID, HWND hwndCtl)
  284. {
  285. BOOL bResult = FALSE;
  286. if (BN_CLICKED == wNotifyCode) // allrespond to clicked
  287. {
  288. switch (wID)
  289. {
  290. case IDC_SCHEDADD:
  291. {
  292. StartScheduleWizard();
  293. HWND hwndList = GetDlgItem(hDlg, IDC_SCHEDLIST);
  294. BOOL fEnable = ListView_GetSelectedCount(hwndList)? TRUE: FALSE;
  295. SetButtonState(IDC_SCHEDEDIT,fEnable);
  296. SetButtonState(IDC_SCHEDREMOVE,fEnable);
  297. }
  298. break;
  299. case IDC_SCHEDREMOVE:
  300. {
  301. HWND hwndList = GetDlgItem(hDlg, IDC_SCHEDLIST);
  302. int iItem = ListView_GetSelectionMark(hwndList);
  303. RemoveTask(iItem);
  304. BOOL fEnable = ListView_GetSelectedCount(hwndList)? TRUE: FALSE;
  305. SetButtonState(IDC_SCHEDEDIT,fEnable);
  306. SetButtonState(IDC_SCHEDREMOVE,fEnable);
  307. }
  308. break;
  309. case IDC_SCHEDEDIT:
  310. {
  311. HWND hwndList = GetDlgItem(hDlg, IDC_SCHEDLIST);
  312. int iItem = ListView_GetSelectionMark(hwndList);
  313. EditTask(iItem);
  314. BOOL fEnable = ListView_GetSelectedCount(hwndList)? TRUE: FALSE;
  315. SetButtonState(IDC_SCHEDEDIT,fEnable);
  316. SetButtonState(IDC_SCHEDREMOVE,fEnable);
  317. }
  318. break;
  319. default:
  320. break;
  321. }
  322. }
  323. return bResult;
  324. }
  325. //+-------------------------------------------------------------------------------
  326. //
  327. // FUNCTION: BOOL CSchedSyncPage::EditTask(int iItem)
  328. //
  329. // PURPOSE: edits the selected task
  330. //
  331. // RETURN VALUE: return TRUE if we process it ok.
  332. //
  333. //+-------------------------------------------------------------------------------
  334. BOOL CSchedSyncPage::EditTask(int iItem)
  335. {
  336. LV_ITEM lvItem;
  337. WCHAR pwszScheduleName[MAX_PATH + 1];
  338. DWORD cchScheduleName = ARRAYSIZE(pwszScheduleName);
  339. ZeroMemory(&lvItem, sizeof(lvItem));
  340. lvItem.mask = LVIF_PARAM;
  341. lvItem.iItem = iItem;
  342. ListView_GetItem(GetDlgItem(m_hwnd, IDC_SCHEDLIST), &lvItem);
  343. if (lvItem.iItem != -1)
  344. {
  345. ISyncSchedule *pISyncSched = (ISyncSchedule *) lvItem.lParam;
  346. //Start on the scheduled items page
  347. pISyncSched->EditSyncSchedule(m_hwnd, 0);
  348. pISyncSched->GetScheduleName(&cchScheduleName, pwszScheduleName);
  349. ListView_SetItemText( GetDlgItem(m_hwnd,IDC_SCHEDLIST), iItem, 0,pwszScheduleName);
  350. }
  351. return TRUE;
  352. }
  353. //+-------------------------------------------------------------------------------
  354. //
  355. // FUNCTION: BOOL CSchedSyncPage::RemoveTask(int iItem)
  356. //
  357. // PURPOSE: removes the selected task
  358. //
  359. // RETURN VALUE: return TRUE if we process it ok.
  360. //
  361. //+-------------------------------------------------------------------------------
  362. // Review - Why can't we just alloc what we need instead of eating up the stack.
  363. BOOL CSchedSyncPage::RemoveTask(int iItem)
  364. {
  365. TCHAR ptszScheduleName[MAX_PATH + 1];
  366. WCHAR pwszScheduleName[MAX_PATH + 1];
  367. TCHAR szFmt[MAX_PATH];
  368. TCHAR szTitle[MAX_PATH];
  369. TCHAR szStr[MAX_PATH];
  370. SYNCSCHEDULECOOKIE SyncSchedCookie;
  371. DWORD cchScheduleName = ARRAYSIZE(pwszScheduleName);
  372. if (!m_pISyncSchedMgr)
  373. {
  374. return FALSE;
  375. }
  376. LV_ITEM lvItem;
  377. ZeroMemory(&lvItem, sizeof(lvItem));
  378. lvItem.mask = LVIF_PARAM;
  379. lvItem.iItem = iItem;
  380. ListView_GetItem(GetDlgItem(m_hwnd, IDC_SCHEDLIST), &lvItem);
  381. if (lvItem.iItem == -1)
  382. {
  383. return FALSE;
  384. }
  385. ISyncSchedule *pISyncSched = (ISyncSchedule *) lvItem.lParam;
  386. if (NULL == pISyncSched)
  387. {
  388. return FALSE;
  389. }
  390. if (NOERROR != pISyncSched->GetScheduleName(&cchScheduleName,pwszScheduleName))
  391. {
  392. *ptszScheduleName = TEXT('\0');
  393. }
  394. else
  395. {
  396. if (FAILED(StringCchCopy(ptszScheduleName, ARRAYSIZE(ptszScheduleName), pwszScheduleName)))
  397. {
  398. return FALSE;
  399. }
  400. }
  401. // make sure user really wants to delete this schedule
  402. LoadString(g_hmodThisDll, IDS_CONFIRMSCHEDDELETE_TITLE, szTitle, ARRAYLEN(szTitle));
  403. LoadString(g_hmodThisDll, IDS_CONFIRMSCHEDDELETE_TEXT, szFmt, ARRAYLEN(szFmt));
  404. StringCchPrintf(szStr, ARRAYSIZE(szStr), szFmt, ptszScheduleName); // truncation fine, this is for display
  405. if (IDNO == MessageBox(m_hwnd,szStr,szTitle,MB_YESNO | MB_ICONQUESTION))
  406. {
  407. return FALSE;
  408. }
  409. cchScheduleName = ARRAYSIZE(ptszScheduleName);
  410. //Get the Cookie from the schedule
  411. if (FAILED(((LPSYNCSCHEDULE)pISyncSched)->GetScheduleGUIDName
  412. (&cchScheduleName,ptszScheduleName)))
  413. {
  414. return FALSE;
  415. }
  416. ptszScheduleName[GUIDSTR_MAX] = NULL;
  417. if (FAILED(StringCchCopy(pwszScheduleName,ARRAYSIZE(pwszScheduleName), ptszScheduleName)))
  418. {
  419. return FALSE;
  420. }
  421. GUIDFromString(pwszScheduleName, &SyncSchedCookie);
  422. //release this pISyncSched
  423. pISyncSched->Release();
  424. m_pISyncSchedMgr->RemoveSchedule(&SyncSchedCookie);
  425. HWND hwndList = GetDlgItem(m_hwnd, IDC_SCHEDLIST);
  426. ListView_DeleteItem(hwndList, iItem);
  427. UpdateWindow(hwndList);
  428. return TRUE;
  429. }
  430. //+-------------------------------------------------------------------------------
  431. //
  432. // FUNCTION: StartScheduleWizard(HINSTANCE hinst)
  433. //
  434. // PURPOSE: Display the Onestop schedsync wizard
  435. //
  436. //
  437. //--------------------------------------------------------------------------------
  438. BOOL CSchedSyncPage::StartScheduleWizard()
  439. {
  440. BOOL fRet = FALSE;
  441. ISyncSchedule *pISyncSched = NULL;
  442. SYNCSCHEDULECOOKIE SyncSchedCookie = GUID_NULL;
  443. if (m_pISyncSchedMgr &&
  444. S_OK == m_pISyncSchedMgr->LaunchScheduleWizard(
  445. m_hwnd,
  446. 0,
  447. &SyncSchedCookie,
  448. &pISyncSched))
  449. {
  450. TCHAR ptszBuf[MAX_PATH + 1];
  451. WCHAR pwszName[MAX_PATH + 1];
  452. DWORD cchName = ARRAYSIZE(pwszName);
  453. LV_ITEM lvItem;
  454. if (SUCCEEDED(pISyncSched->GetScheduleName(&cchName, pwszName)) &&
  455. SUCCEEDED(StringCchCopy(ptszBuf, ARRAYSIZE(ptszBuf), pwszName)))
  456. {
  457. ZeroMemory(&lvItem, sizeof(lvItem));
  458. lvItem.mask = LVIF_TEXT | LVIF_PARAM;
  459. lvItem.pszText = ptszBuf;
  460. if (m_iDefaultIconImageIndex >= 0)
  461. {
  462. lvItem.mask |= LVIF_IMAGE;
  463. lvItem.iImage = m_iDefaultIconImageIndex;
  464. }
  465. //Save the ISyncSched pointer in the list view data
  466. lvItem.lParam = (LPARAM)pISyncSched;
  467. //add the item to the list
  468. ListView_InsertItem(GetDlgItem(m_hwnd,IDC_SCHEDLIST), &lvItem);
  469. fRet = TRUE;
  470. }
  471. else
  472. {
  473. pISyncSched->Release();
  474. }
  475. }
  476. return fRet;
  477. }