windows-nt/Source/XPSP1/NT/com/mobile/syncmgr/dll/schdsync.cpp
2020-09-26 16:20:57 +08:00

602 lines
15 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1998.
//
// File: schdsync.cpp
//
// Contents: SyncMgr AutoSync class
//
// Classes: CSchedSyncPage
//
// Notes:
//
// History: 14-Nov-97 SusiA Created.
//
//--------------------------------------------------------------------------
#include "precomp.h"
DWORD StartScheduler();
extern HINSTANCE g_hmodThisDll; // Handle to this DLL itself.
extern OSVERSIONINFOA g_OSVersionInfo; // osVersionInfo,
extern LANGID g_LangIdSystem; // LangId of system we are running on.
#define UNLIMITED_SCHEDULE_COUNT 50 //Review: What is a reasonable amount of shcedules to grab at a time
#define MAX_APPEND_STRING_LEN 32
//+-------------------------------------------------------------------------------
//
// FUNCTION: BOOL CSchedSyncPage::Initialize()
//
// PURPOSE: initialization for the autosync page
//
// RETURN VALUE: return TRUE if we process it ok.
//
//+-------------------------------------------------------------------------------
BOOL CSchedSyncPage::Initialize()
{
//initialize the item list
HWND hwndList = GetDlgItem(m_hwnd,IDC_SCHEDLIST);
TCHAR pszColumnTitle[MAX_PATH + 1];
LV_COLUMN columnInfo;
HIMAGELIST himage;
INT iItem = -1;
UINT ImageListflags;
LoadString(m_hinst, IDS_SCHEDULE_COLUMN_TITLE,pszColumnTitle, MAX_PATH );
ListView_SetExtendedListViewStyle(hwndList, LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP );
ImageListflags = ILC_COLOR | ILC_MASK;
if (IsHwndRightToLeft(m_hwnd))
{
ImageListflags |= ILC_MIRROR;
}
// create an imagelist
himage = ImageList_Create( GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),ImageListflags,5,20);
if (himage)
{
ListView_SetImageList(hwndList,himage,LVSIL_SMALL);
}
HICON hIcon = LoadIcon(m_hinst,MAKEINTRESOURCE(IDI_TASKSCHED));
if (hIcon)
{
m_iDefaultIconImageIndex = ImageList_AddIcon(himage,hIcon);
}
else
{
m_iDefaultIconImageIndex = -1;
}
// Insert the Proper columns
columnInfo.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
columnInfo.fmt = LVCFMT_LEFT;
columnInfo.cx = 328;
columnInfo .pszText =pszColumnTitle;
columnInfo.cchTextMax = lstrlen(pszColumnTitle) + 1;
columnInfo.iSubItem = 0;
ListView_InsertColumn(hwndList,0,&columnInfo);
if (FAILED(InitializeScheduleAgent()))
{
return FALSE;
}
ShowAllSchedules();
ShowWindow(m_hwnd, /* nCmdShow */ SW_SHOWNORMAL );
UpdateWindow(m_hwnd);
return TRUE;
}
//+-------------------------------------------------------------------------------
//
// FUNCTION: BOOL CSchedSyncPage::InitializeScheduleAgent()
//
// PURPOSE: initialization for the ISyncSCheduleMgr
//
// RETURN VALUE: return the appropriate HRESULT.
//
//+-------------------------------------------------------------------------------
HRESULT CSchedSyncPage::InitializeScheduleAgent()
{
HRESULT hr;
LPUNKNOWN lpUnk;
m_pISyncSchedMgr = NULL;
hr = CoCreateInstance(CLSID_SyncMgr,NULL,CLSCTX_ALL,
IID_ISyncScheduleMgr,(void **) &lpUnk);
if (NOERROR == hr)
{
hr = lpUnk->QueryInterface(IID_ISyncScheduleMgr,
(void **) &m_pISyncSchedMgr);
lpUnk->Release();
}
return hr;
}
//+-------------------------------------------------------------------------------
//
// FUNCTION: BOOL CSchedSyncPage::ShowAllSchedules()
//
// PURPOSE: initialization for the schedsync page
//
// RETURN VALUE: return TRUE if we process it ok.
//
//+-------------------------------------------------------------------------------
BOOL CSchedSyncPage::ShowAllSchedules()
{
HRESULT hr;
BOOL fResult = FALSE;
IEnumSyncSchedules *pEnum = NULL;
int iItem = -1;
DWORD dwFetched;
HWND hwndListView = GetDlgItem(m_hwnd,IDC_SCHEDLIST);
SYNCSCHEDULECOOKIE SyncScheduleCookie;
if (!m_pISyncSchedMgr || !hwndListView)
{
goto errRtn;
}
//First clear out the list
FreeAllSchedules();
ListView_DeleteAllItems(hwndListView);
if (FAILED(hr = m_pISyncSchedMgr->EnumSyncSchedules(&pEnum)))
{
goto errRtn;
}
while(S_OK == pEnum->Next(1,&SyncScheduleCookie, &dwFetched))
{
ISyncSchedule *pISyncSched;
WCHAR pwszName[MAX_PATH + 1];
DWORD dwSize = MAX_PATH;
LV_ITEM lvItem;
//get the ISyncSched for this schedule
if (FAILED(hr = m_pISyncSchedMgr->OpenSchedule(&SyncScheduleCookie,
0,&pISyncSched)))
{
//can't find this one in the registry - move on.
continue;
}
//Get and convert the schedules friendly name
if (FAILED(hr = pISyncSched->GetScheduleName(&dwSize,pwszName)))
{
goto errRtn;
}
++iItem;
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_TEXT | LVIF_PARAM;
lvItem.pszText = pwszName;
if (m_iDefaultIconImageIndex >= 0)
{
lvItem.mask |= LVIF_IMAGE;
lvItem.iImage = m_iDefaultIconImageIndex;
}
//Save the ISyncSched pointer in the list view data
lvItem.lParam = (LPARAM)pISyncSched;
//add the item to the list
ListView_InsertItem(hwndListView, &lvItem);
}
if (iItem != -1)
{
ListView_SetItemState(hwndListView, 0,
LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
}
fResult = TRUE;
errRtn:
if (pEnum)
{
pEnum->Release();
}
return fResult;
}
//+-------------------------------------------------------------------------------
//
// FUNCTION: BOOL CSchedSyncPage::FreeAllSchedules()
//
// PURPOSE: free the schedules for the schedsync page
//
// RETURN VALUE: return TRUE if we process it ok.
//
//+-------------------------------------------------------------------------------
BOOL CSchedSyncPage::FreeAllSchedules()
{
int iItem;
int iItemCount;
HWND hwndListView = GetDlgItem(m_hwnd,IDC_SCHEDLIST);
iItemCount = ListView_GetItemCount(hwndListView);
for(iItem = 0; iItem < iItemCount; iItem++)
{
ISyncSchedule *pISyncSched;
LV_ITEM lvItem;
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_PARAM;
lvItem.iItem = iItem;
ListView_GetItem(hwndListView, &lvItem);
pISyncSched = (ISyncSchedule *) lvItem.lParam;
if (pISyncSched)
{
DWORD cRefs;
cRefs = pISyncSched->Release();
Assert(0 == cRefs);
}
}
return TRUE;
}
//-----------------------------------------------------------------------------
//
// FUNCTION: CSchedSyncPage::OnNotify(HWND hwnd, int idFrom, LPNMHDR pnmhdr)
//
// PURPOSE: Handle the various notification messages dispatched from schedule
// page
//
//-----------------------------------------------------------------------------
BOOL CSchedSyncPage::OnNotify(HWND hwnd, int idFrom, LPNMHDR pnmhdr)
{
if (IDC_SCHEDLIST == idFrom)
{
switch (pnmhdr->code)
{
case LVN_ITEMCHANGED:
{
NM_LISTVIEW *pnmv = (NM_LISTVIEW FAR *) pnmhdr;
if ( (pnmv->uChanged == LVIF_STATE) &&
((pnmv->uNewState ^ pnmv->uOldState) & LVIS_SELECTED))
{
BOOL fEnable = FALSE;
if (pnmv->uNewState & LVIS_SELECTED)
{
fEnable = TRUE;
}
SetButtonState(IDC_SCHEDREMOVE,fEnable);
SetButtonState(IDC_SCHEDEDIT,fEnable);
return TRUE;
}
}
break;
case NM_DBLCLK:
{
LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW) pnmhdr;
EditTask(lpnmlv->iItem);
}
break;
case NM_RETURN:
{
LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW) pnmhdr;
EditTask(lpnmlv->iItem);
}
break;
default:
break;
}
}
return FALSE;
}
BOOL CSchedSyncPage::SetButtonState(int nIDDlgItem,BOOL fEnabled)
{
BOOL fResult = FALSE;
HWND hwndCtrl = GetDlgItem(m_hwnd,nIDDlgItem);
HWND hwndFocus = NULL;
if (hwndCtrl)
{
if (!fEnabled) // don't bother getting focus if not disabling.
{
hwndFocus = GetFocus();
}
fResult = EnableWindow(GetDlgItem(m_hwnd,nIDDlgItem),fEnabled);
// if control had the focus. and now it doesn't then tab to the
// next control
if (hwndFocus == hwndCtrl
&& !fEnabled)
{
SetFocus(GetDlgItem(m_hwnd,IDC_SCHEDADD)); // if need to change focus set to add.
}
}
return fResult;
}
BOOL CSchedSyncPage::OnCommand(HWND hDlg, WORD wNotifyCode, WORD wID, HWND hwndCtl)
{
BOOL bResult = FALSE;
if (BN_CLICKED == wNotifyCode) // allrespond to clicked
{
switch (wID)
{
case IDC_SCHEDADD:
{
StartScheduleWizard();
HWND hwndList = GetDlgItem(hDlg, IDC_SCHEDLIST);
BOOL fEnable = ListView_GetSelectedCount(hwndList)? TRUE: FALSE;
SetButtonState(IDC_SCHEDEDIT,fEnable);
SetButtonState(IDC_SCHEDREMOVE,fEnable);
}
break;
case IDC_SCHEDREMOVE:
{
HWND hwndList = GetDlgItem(hDlg, IDC_SCHEDLIST);
int iItem = ListView_GetSelectionMark(hwndList);
RemoveTask(iItem);
BOOL fEnable = ListView_GetSelectedCount(hwndList)? TRUE: FALSE;
SetButtonState(IDC_SCHEDEDIT,fEnable);
SetButtonState(IDC_SCHEDREMOVE,fEnable);
}
break;
case IDC_SCHEDEDIT:
{
HWND hwndList = GetDlgItem(hDlg, IDC_SCHEDLIST);
int iItem = ListView_GetSelectionMark(hwndList);
EditTask(iItem);
BOOL fEnable = ListView_GetSelectedCount(hwndList)? TRUE: FALSE;
SetButtonState(IDC_SCHEDEDIT,fEnable);
SetButtonState(IDC_SCHEDREMOVE,fEnable);
}
break;
default:
break;
}
}
return bResult;
}
//+-------------------------------------------------------------------------------
//
// FUNCTION: BOOL CSchedSyncPage::EditTask(int iItem)
//
// PURPOSE: edits the selected task
//
// RETURN VALUE: return TRUE if we process it ok.
//
//+-------------------------------------------------------------------------------
BOOL CSchedSyncPage::EditTask(int iItem)
{
LV_ITEM lvItem;
WCHAR pwszScheduleName[MAX_PATH + 1];
DWORD dwSize = MAX_PATH;
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_PARAM;
lvItem.iItem = iItem;
ListView_GetItem(GetDlgItem(m_hwnd, IDC_SCHEDLIST), &lvItem);
if (lvItem.iItem != -1)
{
ISyncSchedule *pISyncSched = (ISyncSchedule *) lvItem.lParam;
//Start on the scheduled items page
pISyncSched->EditSyncSchedule(m_hwnd, 0);
pISyncSched->GetScheduleName(&dwSize, pwszScheduleName);
ListView_SetItemText( GetDlgItem(m_hwnd,IDC_SCHEDLIST), iItem, 0,pwszScheduleName);
}
return TRUE;
}
//+-------------------------------------------------------------------------------
//
// FUNCTION: BOOL CSchedSyncPage::RemoveTask(int iItem)
//
// PURPOSE: removes the selected task
//
// RETURN VALUE: return TRUE if we process it ok.
//
//+-------------------------------------------------------------------------------
// Review - Why can't we just alloc what we need instead of eating up the stack.
BOOL CSchedSyncPage::RemoveTask(int iItem)
{
TCHAR ptszScheduleName[MAX_PATH + 1];
WCHAR pwszScheduleName[MAX_PATH + 1];
TCHAR szFmt[MAX_PATH];
TCHAR szTitle[MAX_PATH];
TCHAR szStr[MAX_PATH];
SYNCSCHEDULECOOKIE SyncSchedCookie;
DWORD dwSize = MAX_PATH;
if (!m_pISyncSchedMgr)
{
return FALSE;
}
LV_ITEM lvItem;
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_PARAM;
lvItem.iItem = iItem;
ListView_GetItem(GetDlgItem(m_hwnd, IDC_SCHEDLIST), &lvItem);
if (lvItem.iItem == -1)
{
return FALSE;
}
ISyncSchedule *pISyncSched = (ISyncSchedule *) lvItem.lParam;
if (NULL == pISyncSched)
{
return FALSE;
}
if (NOERROR != pISyncSched->GetScheduleName(&dwSize,pwszScheduleName))
{
*ptszScheduleName = TEXT('\0');
dwSize = 0;
}
else
{
ConvertString(ptszScheduleName,pwszScheduleName,MAX_PATH);
}
// make sure user really wants to delete this schedule
LoadString(g_hmodThisDll, IDS_CONFIRMSCHEDDELETE_TITLE, szTitle, ARRAYLEN(szTitle));
LoadString(g_hmodThisDll, IDS_CONFIRMSCHEDDELETE_TEXT, szFmt, ARRAYLEN(szFmt));
wsprintf(szStr, szFmt,ptszScheduleName);
if (IDNO == MessageBox(m_hwnd,szStr,szTitle,MB_YESNO | MB_ICONQUESTION))
{
return FALSE;
}
dwSize = MAX_PATH;
//Get the Cookie from the schedule
if (FAILED(((LPSYNCSCHEDULE)pISyncSched)->GetScheduleGUIDName
(&dwSize,ptszScheduleName)))
{
return FALSE;
}
ptszScheduleName[GUIDSTR_MAX] = NULL;
ConvertString(pwszScheduleName,ptszScheduleName,MAX_PATH);
GUIDFromString(pwszScheduleName, &SyncSchedCookie);
//release this pISyncSched
pISyncSched->Release();
m_pISyncSchedMgr->RemoveSchedule(&SyncSchedCookie);
HWND hwndList = GetDlgItem(m_hwnd, IDC_SCHEDLIST);
ListView_DeleteItem(hwndList, iItem);
UpdateWindow(hwndList);
return TRUE;
}
//+-------------------------------------------------------------------------------
//
// FUNCTION: StartScheduleWizard(HINSTANCE hinst)
//
// PURPOSE: Display the Onestop schedsync wizard
//
//
//--------------------------------------------------------------------------------
BOOL CSchedSyncPage::StartScheduleWizard()
{
SCODE sc;
ISyncSchedule *pISyncSched;
SYNCSCHEDULECOOKIE SyncSchedCookie = GUID_NULL;
if (!m_pISyncSchedMgr)
{
return FALSE;
}
if (S_OK == (sc = m_pISyncSchedMgr->LaunchScheduleWizard(
m_hwnd,
0,
&SyncSchedCookie,
&pISyncSched)))
{
TCHAR ptszBuf[MAX_PATH + 1];
WCHAR pwszName[MAX_PATH + 1];
DWORD dwSize = MAX_PATH;
LV_ITEM lvItem;
pISyncSched->GetScheduleName(&dwSize, pwszName);
ConvertString(ptszBuf,pwszName,MAX_PATH);
ZeroMemory(&lvItem, sizeof(lvItem));
lvItem.mask = LVIF_TEXT | LVIF_PARAM;
lvItem.pszText = ptszBuf;
if (m_iDefaultIconImageIndex >= 0)
{
lvItem.mask |= LVIF_IMAGE;
lvItem.iImage = m_iDefaultIconImageIndex;
}
//Save the ISyncSched pointer in the list view data
lvItem.lParam = (LPARAM)pISyncSched;
//add the item to the list
ListView_InsertItem(GetDlgItem(m_hwnd,IDC_SCHEDLIST), &lvItem);
return TRUE;
}
return FALSE;
}