windows-nt/Source/XPSP1/NT/net/irda/irprops/imagetransferpage.cpp
2020-09-26 16:20:57 +08:00

391 lines
12 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: imagetransferpage.cpp
//
//--------------------------------------------------------------------------
// ImageTransferPage.cpp : implementation file
//
#include "precomp.hxx"
#include "imagetransferpage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//context ids for context help
const DWORD g_ImageTransferHelp [] = {
IDC_IMAGEXFER_ENABLE_IRCOMM, IDH_IMAGEXFER_ENABLE_IRCOMM,
IDC_IMAGEXFER_DESTGROUP, IDH_DISABLEHELP,
IDC_IMAGEXFER_DESTDESC, IDH_IMAGEXFER_DESTDESC,
IDC_IMAGEXFER_DEST, IDH_IMAGEXFER_DEST,
IDC_IMAGEXFER_BROWSE, IDH_IMAGEXFER_BROWSE,
IDC_IMAGEXFER_EXPLOREONCOMPLETION, IDH_IMAGEXFER_EXPLOREONCOMPLETION,
0, 0
};
//
// Registry entries that control IrTranP image transfer behavior.
// Everything is under HKEY_CURRENT_USER\\Control Panel\\Infrared\IrTranP
// subkey. Whenever there are changes, they are recorded in the registry
// and the service(IrMon) would pick up the changes by RegNotifyChangeKeyValue
// API.
//
//
//
TCHAR const REG_PATH_IRTRANP_CPL[] = TEXT("Control Panel\\Infrared\\IrTranP");
//
// Entry that controls if IrTranPV1 service should be disabled.
// The type is REG_DWORD. Default is enabled(either the entry
// does not exist or the value is zero).
//
TCHAR const REG_STR_DISABLE_IRTRANPV1[] = TEXT("DisableIrTranPv1");
//
// Entry that controls if IrCOMM should be disabled.
// The type is REG_DWORD. Default is enabled(either the entry
// does not exist or the value is zero).
//
TCHAR const REG_STR_DISABLE_IRCOMM[] = TEXT("DisableIrCOMM");
// Entry that specifies the image file destionation subfolder.
// The type is REG_SZ. The default is Shell special folder CSIDL_MYPICTURES
// (if the entry does not exist).
//
TCHAR const REG_STR_DESTLOCATION[] = TEXT("RecvdFilesLocation");
//
// Entry that controls if IrMon should explore the picture subfolder
// when image transfer(s) are done. The type is REG_DWORD.
// Default is enabled(the entry does not exist of its value is
// non-zero.
//
TCHAR const REG_STR_EXPLORE_ON_COMPLETION[] = TEXT("ExploreOnCompletion");
/////////////////////////////////////////////////////////////////////////////
// ImageTransferPage property page
void ImageTransferPage::OnCommand(UINT ctrlId, HWND hwndCtrl, UINT cNotify)
{
switch (ctrlId) {
case IDC_IMAGEXFER_EXPLOREONCOMPLETION:
OnEnableExploring();
break;
case IDC_IMAGEXFER_BROWSE:
OnBrowse();
break;
case IDC_IMAGEXFER_ENABLE_IRCOMM:
OnEnableIrCOMM();
break;
}
}
/////////////////////////////////////////////////////////////////////////////
// ImageTransferPage message handlers
void ImageTransferPage::OnBrowse()
{
BROWSEINFO browseInfo;
TCHAR pszSelectedFolder[MAX_PATH];
TCHAR pszTitle[MAX_PATH];
LPITEMIDLIST lpItemIDList;
LPMALLOC pMalloc;
// load the title string
::LoadString(hInstance, IDS_IMAGEFOLDER_PROMPT, pszTitle,
sizeof(pszTitle) / sizeof(TCHAR));
browseInfo.hwndOwner = hDlg;
browseInfo.pidlRoot = NULL; //this will get the desktop folder
browseInfo.pszDisplayName = pszSelectedFolder;
browseInfo.lpszTitle = pszTitle;
browseInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_RETURNFSANCESTORS |
BIF_VALIDATE | BIF_EDITBOX;
browseInfo.lpfn = BrowseCallback;
// this will the the initial selection which is from
// either the registry or the default or the last value
// selected.
browseInfo.lParam = (LPARAM)m_TempDestLocation;
if (NULL != (lpItemIDList = SHBrowseForFolder (&browseInfo)))
{
//the user chose the OK button in the browse dialog box
SHGetPathFromIDList(lpItemIDList, pszSelectedFolder);
lstrcpy(m_TempDestLocation, pszSelectedFolder);
m_ctrlDestLocation.SetWindowText(m_TempDestLocation);
if (lstrcmpi(m_TempDestLocation, m_FinalDestLocation))
m_ChangeMask |= CHANGE_IMAGE_LOCATION;
else
m_ChangeMask &= ~(CHANGE_IMAGE_LOCATION);
SetModified(m_ChangeMask);
SHGetMalloc(&pMalloc);
pMalloc->Free (lpItemIDList); //free the item id list as we do not need it any more
pMalloc->Release();
}
}
void ImageTransferPage::OnEnableExploring()
{
int Enabled = m_ctrlEnableExploring.GetCheck();
// Only accepted value is 0 or 1.
assert(Enabled >= 0 && Enabled <= 1);
// if new state is different than our old one
// enable/disable Apply Now accordingly
if (Enabled != m_ExploringEnabled)
m_ChangeMask |= CHANGE_EXPLORE_ON_COMPLETION;
else
m_ChangeMask &= ~(CHANGE_EXPLORE_ON_COMPLETION);
SetModified(m_ChangeMask);
}
void ImageTransferPage::OnEnableIrCOMM()
{
int Enabled = m_ctrlEnableIrCOMM.GetCheck();
// Only accepted value is 0 or 1.
assert(Enabled >= 0 && Enabled <= 1);
// enable/disable Apply Now accordingly.
if (Enabled != m_IrCOMMEnabled)
m_ChangeMask |= CHANGE_DISABLE_IRCOMM;
else
m_ChangeMask &= ~(CHANGE_DISABLE_IRCOMM);
SetModified(m_ChangeMask);
}
void ImageTransferPage::LoadRegistrySettings()
{
HKEY hKeyIrTranP;
DWORD dwType, dwValue, dwSize;
LONG Error;
//
// the ctor should have initialized
// m_ExploringEnabled,
// m_IrCOMMEnabled and
// m_FinalDestLocation
//
// It is okay if we can not open the registry key.
// We simply use the defaults.
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, REG_PATH_IRTRANP_CPL, 0,
KEY_READ, &hKeyIrTranP))
{
// read the value "ExploreOnCompletion" and "RecvdFilesLocation"
dwSize = sizeof(m_ExploringEnabled);
Error = RegQueryValueEx(hKeyIrTranP,
REG_STR_EXPLORE_ON_COMPLETION,
0,
&dwType,
(LPBYTE)&dwValue,
&dwSize
);
if (ERROR_SUCCESS == Error && REG_DWORD == dwType)
{
m_ExploringEnabled = (dwValue) ? 1 : 0;
}
dwSize = sizeof(m_FinalDestLocation);
Error = RegQueryValueEx(hKeyIrTranP,
REG_STR_DESTLOCATION,
0,
&dwType,
(LPBYTE)m_FinalDestLocation,
&dwSize);
if (ERROR_SUCCESS != Error || REG_SZ != dwType) {
// If the destionation location is not specified,
// use the default(My Picture subfolder).
// Create it if necessary.
SHGetSpecialFolderPath(hDlg, m_FinalDestLocation, CSIDL_MYPICTURES, TRUE);
} else {
// make sure the folder does exist
dwType = GetFileAttributes(m_FinalDestLocation);
if (0xFFFFFFFF == dwType || !(dwType & FILE_ATTRIBUTE_DIRECTORY))
{
// the destination does not exist or it is not a
// directory, delete it
Error = RegDeleteValue(hKeyIrTranP, REG_STR_DESTLOCATION);
if (ERROR_SUCCESS == Error) {
// If the destionation location is not specified,
// use the default(My Picture subfolder).
// Create it if necessary.
SHGetSpecialFolderPath(hDlg, m_FinalDestLocation, CSIDL_MYPICTURES, TRUE);
}
}
}
//
// m_TempDestLocation will be used as the intial
// folder of choice for SHBrowseForFolder call.
//
lstrcpy(m_TempDestLocation, m_FinalDestLocation);
dwSize = sizeof(dwValue);
Error = RegQueryValueEx(hKeyIrTranP,
REG_STR_DISABLE_IRCOMM,
0,
&dwType,
(LPBYTE)&dwValue,
&dwSize
);
if (ERROR_SUCCESS == Error && REG_DWORD == dwType)
{
// when the value is non-zero, IrCOMM is disabled.
// Do not assume it is either 1 or 0!
m_IrCOMMEnabled = (dwValue) ? 0 : 1;
} else {
// default
m_IrCOMMEnabled = 0;
}
RegCloseKey(hKeyIrTranP);
}
}
void ImageTransferPage::SaveRegistrySettings()
{
LONG Error;
HKEY hKeyIrTranP;
if (m_ChangeMask)
{
Error = RegCreateKeyEx(HKEY_CURRENT_USER,
REG_PATH_IRTRANP_CPL,
0, // reserved
NULL, // class
REG_OPTION_NON_VOLATILE, // options
KEY_ALL_ACCESS,// REGSAM
NULL, // Security
&hKeyIrTranP, //
NULL // disposition
);
if (ERROR_SUCCESS == Error)
{
if (m_ChangeMask & CHANGE_EXPLORE_ON_COMPLETION)
{
Error = RegSetValueEx(hKeyIrTranP,
REG_STR_EXPLORE_ON_COMPLETION,
0,
REG_DWORD,
(LPBYTE)&m_ExploringEnabled,
sizeof(m_ExploringEnabled)
);
if (ERROR_SUCCESS != Error)
{
IdMessageBox(hDlg, IDS_ERROR_REGVALUE_WRITE);
}
}
if (m_ChangeMask & CHANGE_IMAGE_LOCATION)
{
Error = RegSetValueEx(hKeyIrTranP,
REG_STR_DESTLOCATION,
0,
REG_SZ,
(LPBYTE)m_FinalDestLocation,
lstrlen(m_FinalDestLocation) * sizeof(TCHAR)
);
if (ERROR_SUCCESS != Error)
IdMessageBox(hDlg, IDS_ERROR_REGVALUE_WRITE);
}
if (m_ChangeMask & CHANGE_DISABLE_IRCOMM)
{
int IrCOMMDisabled = m_IrCOMMEnabled ^ 1;
Error = RegSetValueEx(hKeyIrTranP,
REG_STR_DISABLE_IRCOMM,
0,
REG_DWORD,
(LPBYTE)&IrCOMMDisabled,
sizeof(IrCOMMDisabled)
);
if (ERROR_SUCCESS != Error)
IdMessageBox(hDlg, IDS_ERROR_REGVALUE_WRITE);
}
RegCloseKey(hKeyIrTranP);
}
else
{
IdMessageBox(hDlg, IDS_ERROR_REGKEY_CREATE);
}
}
}
INT_PTR ImageTransferPage::OnInitDialog(HWND hDialog)
{
PropertyPage::OnInitDialog(hDialog);
m_ctrlEnableExploring.SetParent(hDialog);
m_ctrlDestLocation.SetParent(hDialog);
m_ctrlEnableIrCOMM.SetParent(hDialog);
//
// Load initial settings from the system registry
//
LoadRegistrySettings();
m_ctrlEnableExploring.SetCheck(m_ExploringEnabled);
m_ctrlEnableIrCOMM.SetCheck(m_IrCOMMEnabled);
m_ctrlDestLocation.SetWindowText(m_FinalDestLocation);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void ImageTransferPage::OnApply(LPPSHNOTIFY lppsn)
{
if (m_ChangeMask)
{
if (m_ChangeMask & CHANGE_IMAGE_LOCATION)
lstrcpy(m_FinalDestLocation, m_TempDestLocation);
if (m_ChangeMask & CHANGE_EXPLORE_ON_COMPLETION)
m_ExploringEnabled = m_ctrlEnableExploring.GetCheck();
if (m_ChangeMask & CHANGE_DISABLE_IRCOMM)
m_IrCOMMEnabled = m_ctrlEnableIrCOMM.GetCheck();
SaveRegistrySettings();
m_ChangeMask = 0;
}
PropertyPage::OnApply(lppsn);
}
BOOL ImageTransferPage::OnHelp (LPHELPINFO pHelpInfo)
{
TCHAR szHelpFile[MAX_PATH];
::LoadString(hInstance, IDS_HELP_FILE, szHelpFile, MAX_PATH);
::WinHelp((HWND)(pHelpInfo->hItemHandle),
(LPCTSTR) szHelpFile,
HELP_WM_HELP,
(ULONG_PTR)(LPTSTR)g_ImageTransferHelp);
return FALSE;
}
BOOL ImageTransferPage::OnContextMenu (WPARAM wParam, LPARAM lParam)
{
TCHAR szHelpFile[MAX_PATH];
::LoadString(hInstance, IDS_HELP_FILE, szHelpFile, MAX_PATH);
::WinHelp((HWND) wParam,
(LPCTSTR) szHelpFile,
HELP_CONTEXTMENU,
(ULONG_PTR)(LPVOID)g_ImageTransferHelp);
return FALSE;
}