|
|
//+-------------------------------------------------------------------------
//
// 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; }
|