Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

1100 lines
36 KiB

/****************************************************************************/
/* */
/* WFDLGS.C - */
/* */
/* Windows File System Dialog procedures */
/* */
/****************************************************************************/
#include "winfile.h"
#include "winnet.h"
#include "wnetcaps.h" // WNetGetCaps()
#include "lfn.h"
#include "wfcopy.h"
/*--------------------------------------------------------------------------*/
/* */
/* ChooseDriveDlgProc() - */
/* */
/*--------------------------------------------------------------------------*/
INT_PTR
APIENTRY
ChooseDriveDlgProc(
register HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
CHAR szDrive[5];
switch (wMsg) {
case WM_INITDIALOG:
{
INT i;
HWND hwndLB;
lstrcpy(szDrive, "A:");
hwndLB = GetDlgItem(hDlg, IDD_DRIVE);
switch (wSuperDlgMode) {
case IDM_SYSDISK:
case IDM_DISKCOPY:
FillFloppies:
for (i = 0; i < cDrives; i++) {
if (IsRemovableDrive(rgiDrive[i])) {
szDrive[0] = (CHAR)('A'+rgiDrive[i]);
SendMessage(hwndLB, CB_ADDSTRING, 0, (LPARAM)szDrive);
}
}
if (wSuperDlgMode == IDM_DISKCOPY && hwndLB == GetDlgItem(hDlg, IDD_DRIVE)) {
SendMessage(hwndLB, CB_SETCURSEL, 0, 0L);
hwndLB = GetDlgItem(hDlg, IDD_DRIVE1);
goto FillFloppies;
}
break;
case IDM_DISCONNECT:
for (i=0; i < cDrives; i++) {
wParam = rgiDrive[i];
if (!IsCDRomDrive((WORD)wParam)) {
CHAR szTemp[80];
szTemp[0] = (CHAR)('A' + wParam);
szTemp[1] = ':';
szTemp[2] = 0;
lstrcpy(szDrive,szTemp);
szTemp[2] = ' ';
if (WFGetConnection(szDrive, szTemp+3, FALSE) != WN_SUCCESS)
continue;
SendMessage(hwndLB, LB_ADDSTRING, 0, (LPARAM)szTemp);
}
}
SendMessage(hwndLB,LB_SETCURSEL,0,0L);
return TRUE;
}
SendMessage(hwndLB, CB_SETCURSEL, 0, 0L);
break;
}
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDD_HELP:
goto DoHelp;
case IDOK:
{
CHAR szTemp[80];
if (wSuperDlgMode == IDM_DISCONNECT) {
SendDlgItemMessage(hDlg, IDD_DRIVE, LB_GETTEXT,
(WPARAM)SendDlgItemMessage(hDlg, IDD_DRIVE,
WM_COMMAND,
GET_WM_COMMAND_MPS(LB_GETCURSEL,0,0)),
(LPARAM)szTemp);
} else
GetDlgItemText(hDlg, IDD_DRIVE, szTemp, sizeof(szTemp) - 1);
iFormatDrive = (INT)(szTemp[0] - 'A');
if (wSuperDlgMode == IDM_DISKCOPY) {
GetDlgItemText(hDlg, IDD_DRIVE1, szTemp, sizeof(szTemp) - 1);
iCurrentDrive = (INT)(szTemp[0] - 'A');
}
EndDialog(hDlg, TRUE);
break;
}
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
default:
return FALSE;
}
break;
default:
if (wMsg == wHelpMessage) {
DoHelp:
WFHelp(hDlg);
return TRUE;
} else
return FALSE;
}
return TRUE;
}
/*--------------------------------------------------------------------------*/
/* */
/* DiskLabelDlgProc() - */
/* */
/*--------------------------------------------------------------------------*/
INT_PTR
APIENTRY
DiskLabelDlgProc(
register HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
CHAR szOldVol[13];
CHAR szNewVol[13];
switch (wMsg) {
case WM_INITDIALOG:
/* Get the current volume label */
szNewVol[0] = (CHAR)(GetSelectedDrive() + 'A');
szNewVol[1] = ':';
szNewVol[2] = '\0';
if (!IsTheDiskReallyThere(hDlg, szNewVol, FUNC_LABEL)) {
EndDialog(hDlg, FALSE);
break;
}
GetVolumeLabel(szNewVol[0]-'A', szOldVol, FALSE);
OemToAnsi(szOldVol, szOldVol);
/* Display the current volume label. */
SetDlgItemText(hDlg, IDD_NAME, szOldVol);
SendDlgItemMessage(hDlg, IDD_NAME, EM_LIMITTEXT, sizeof(szNewVol)-2, 0L);
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDD_HELP:
goto DoHelp;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
case IDOK:
{
HWND hwnd;
BOOL bOldVolExists;
GetVolumeLabel(GetSelectedDrive(), szOldVol, FALSE);
bOldVolExists = (szOldVol[0] != TEXT('\0'));
GetDlgItemText(hDlg, IDD_NAME, szNewVol, sizeof(szNewVol));
if (MySetVolumeLabel(GetSelectedDrive(), bOldVolExists, szNewVol)) {
GetWindowText(hDlg, szTitle, sizeof(szTitle));
LoadString(hAppInstance, IDS_LABELDISKERR, szMessage, sizeof(szMessage));
MessageBox(hDlg, szMessage, szTitle, MB_OK | MB_ICONSTOP);
EndDialog(hDlg, FALSE);
break;
}
for (hwnd = GetWindow(hwndMDIClient, GW_CHILD);
hwnd;
hwnd = GetWindow(hwnd, GW_HWNDNEXT)) {
// refresh windows on this drive
if ((LONG)GetSelectedDrive() == GetWindowLong(hwnd, GWL_TYPE))
SendMessage(hwnd, FS_CHANGEDRIVES, 0, 0L);
}
EndDialog(hDlg, TRUE);
break;
}
default:
return FALSE;
}
break;
default:
if (wMsg == wHelpMessage) {
DoHelp:
WFHelp(hDlg);
return TRUE;
} else
return FALSE;
}
return TRUE;
}
INT
APIENTRY
FormatDiskette(
HWND hwnd
)
{
WNDPROC lpfnDialog;
INT res;
DWORD dwSave;
// in case current drive is on floppy
GetSystemDirectory(szMessage, sizeof(szMessage));
SheChangeDir(szMessage);
dwSave = dwContext;
dwContext = IDH_FORMAT;
res = (int)DialogBox(hAppInstance, MAKEINTRESOURCE(FORMATDLG), hwnd, FormatDlgProc);
dwContext = dwSave;
return res;
}
WORD fFormatFlags = 0;
WORD nLastDriveInd = 0;
VOID
FillDriveCapacity(
HWND hDlg,
INT nDrive
)
{
INT count, cap;
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_RESETCONTENT, 0, 0L);
cap = (INT)GetDriveCapacity((WORD)nDrive);
count = 0; // index of each string, since we are inserting at the end
// 3.5 (720 1.44 2.88
if ((cap >= 3) && (cap <= 5)) {
// 1.44
LoadString(hAppInstance, IDS_144MB, szTitle, sizeof(szTitle));
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_INSERTSTRING, count, (LPARAM)szTitle);
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_SETITEMDATA, count++, MAKELONG(IDS_144MB,0));
// 720
LoadString(hAppInstance, IDS_720KB, szTitle, sizeof(szTitle));
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_INSERTSTRING, count, (LPARAM)szTitle);
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_SETITEMDATA, count++, MAKELONG(IDS_720KB,0));
if (cap == 5) { // 2.88
LoadString(hAppInstance, IDS_288MB, szTitle, sizeof(szTitle));
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_INSERTSTRING, count, (LPARAM)szTitle);
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_SETITEMDATA, count++, MAKELONG(IDS_288MB,0));
}
} else if ((cap >= 1) && (cap <= 2)) {
// 1.2
LoadString(hAppInstance, IDS_12MB, szTitle, sizeof(szTitle));
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_INSERTSTRING, count, (LPARAM)szTitle);
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_SETITEMDATA, count++, MAKELONG(IDS_12MB,0));
// 360
LoadString(hAppInstance, IDS_360KB, szTitle, sizeof(szTitle));
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_INSERTSTRING, count, (LPARAM)szTitle);
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_SETITEMDATA, count++, MAKELONG(IDS_360KB,0));
} else {
// device cap
LoadString(hAppInstance, IDS_DEVICECAP, szTitle, sizeof(szTitle));
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_INSERTSTRING, count, (LPARAM)szTitle);
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_SETITEMDATA, count, MAKELONG(IDS_DEVICECAP, 0));
}
SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_SETCURSEL, FF_CAPMASK & fFormatFlags, 0L);
}
/*--------------------------------------------------------------------------*/
/* */
/* FormatDlgProc() - */
/* */
/*--------------------------------------------------------------------------*/
INT_PTR
APIENTRY
FormatDlgProc(
register HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
CHAR szLabel[13];
CHAR szBuf[128];
INT i, iCap, iDrive;
WORD count;
UNREFERENCED_PARAMETER(lParam);
switch (wMsg) {
case WM_INITDIALOG:
// fill drives combo
count = 0;
LoadString(hAppInstance, IDS_DRIVETEMP, szTitle, sizeof(szTitle));
for (i=0; i < cDrives; i++) {
if (IsRemovableDrive(rgiDrive[i])) {
wsprintf(szMessage, szTitle, (CHAR)('A'+rgiDrive[i]), ' ');
if (count == (WORD)nLastDriveInd)
iDrive = i;
SendDlgItemMessage(hDlg, IDD_DRIVE, CB_INSERTSTRING, count, (LPARAM)szMessage);
SendDlgItemMessage(hDlg, IDD_DRIVE, CB_SETITEMDATA, count++, MAKELONG(rgiDrive[i], 0));
}
}
SendDlgItemMessage(hDlg, IDD_NAME, EM_LIMITTEXT, sizeof(szLabel)-2, 0L);
if (fFormatFlags & FF_SAVED) {
CheckDlgButton(hDlg, IDD_VERIFY, fFormatFlags & FF_QUICK);
CheckDlgButton(hDlg, IDD_MAKESYS, fFormatFlags & FF_MAKESYS);
}
SendDlgItemMessage(hDlg, IDD_DRIVE, CB_SETCURSEL, nLastDriveInd, 0L);
FillDriveCapacity(hDlg, rgiDrive[iDrive]);
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDD_HELP:
goto DoHelp;
case IDD_DRIVE:
switch (GET_WM_COMMAND_CMD(wParam, lParam)) {
case CBN_SELCHANGE:
i = (INT)SendDlgItemMessage(hDlg, IDD_DRIVE, CB_GETCURSEL, 0, 0L);
i = (INT)SendDlgItemMessage(hDlg, IDD_DRIVE, CB_GETITEMDATA, i, 0L);
fFormatFlags &= ~FF_CAPMASK;
FillDriveCapacity(hDlg, i);
break;
}
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
case IDOK:
nLastDriveInd = (WORD)SendDlgItemMessage(hDlg, IDD_DRIVE, CB_GETCURSEL, 0, 0L);
iFormatDrive = (INT)SendDlgItemMessage(hDlg, IDD_DRIVE, CB_GETITEMDATA, nLastDriveInd, 0L);
i = (INT)SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_GETCURSEL, 0, 0L);
fFormatFlags &= ~FF_CAPMASK; // clear any previous bits
fFormatFlags |= (WORD)i; // save last selection as default
if (i >= 0)
iCap = (INT)SendDlgItemMessage(hDlg, IDD_HIGHCAP, CB_GETITEMDATA, i, 0L);
else
iCap = IDS_DEVICECAP;
if (iCap == IDS_DEVICECAP)
iCap = -1;
else
iCap -= IDS_DRIVEBASE; // normalize down to
// indexes into bpbList[]
fFormatFlags |= FF_SAVED;
if (IsDlgButtonChecked(hDlg, IDD_MAKESYS))
fFormatFlags |= FF_MAKESYS;
else
fFormatFlags &= ~FF_MAKESYS;
if (IsDlgButtonChecked(hDlg, IDD_VERIFY))
fFormatFlags |= FF_QUICK;
else
fFormatFlags &= ~FF_QUICK;
GetDlgItemText(hDlg, IDD_NAME, szLabel, sizeof(szLabel));
if (bConfirmFormat) {
LoadString(hAppInstance, IDS_FORMATCONFIRMTITLE, szTitle, sizeof(szTitle));
LoadString(hAppInstance, IDS_FORMATCONFIRM, szBuf, sizeof(szBuf));
wsprintf(szMessage, szBuf, (CHAR)('A'+iFormatDrive));
if (MessageBox(hDlg, szMessage, szTitle, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON1) != IDYES)
break;
}
if (FormatFloppy(hDlg, (WORD)iFormatDrive, iCap, (fFormatFlags & FF_MAKESYS), (fFormatFlags & FF_QUICK))) {
if (szLabel[0])
MySetVolumeLabel(iFormatDrive, FALSE, szLabel);
if (fFormatFlags & FF_ONLYONE) {
fFormatFlags &= ~FF_ONLYONE; // clear the flag
EndDialog(hDlg, TRUE);
} else {
SetDlgItemText(hDlg, IDD_NAME, szNULL); // clear it
LoadString(hAppInstance, IDS_FORMATCOMPLETE, szTitle, sizeof(szTitle));
LoadString(hAppInstance, IDS_FORMATANOTHER, szMessage, sizeof(szMessage));
wsprintf(szBuf, szMessage, GetTotalDiskSpace((WORD)iFormatDrive), GetFreeDiskSpace((WORD)iFormatDrive));
if (MessageBox(hDlg, szBuf, szTitle, MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2) != IDYES) {
EndDialog(hDlg, TRUE);
}
}
#if 0
// this doesn't work quite right
// refresh all windows open on this drive
for (hwnd = GetWindow(hwndMDIClient, GW_CHILD);
hwnd;
hwnd = GetWindow(hwnd, GW_HWNDNEXT)) {
// refresh windows on this drive
if (iFormatDrive == (INT)GetWindowLong(hwnd, GWL_TYPE))
SendMessage(hwnd, FS_CHANGEDRIVES, 0, 0L);
}
#endif
}
break;
default:
return FALSE;
}
break;
default:
if (wMsg == wHelpMessage) {
DoHelp:
WFHelp(hDlg);
return TRUE;
} else
return FALSE;
}
return TRUE;
}
/*--------------------------------------------------------------------------*/
/* */
/* ProgressDlgProc() - */
/* */
/*--------------------------------------------------------------------------*/
INT_PTR
APIENTRY
ProgressDlgProc(
register HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (wMsg) {
case WM_INITDIALOG:
/* Check if this is the dialog for DISKCOPY */
if (GetDlgItem(hDlg, IDD_DRIVE)) {
/* Yes! Then, tell the user the drive we are copying from. */
LoadString(hAppInstance, IDS_DRIVETEMP, szTitle, sizeof(szTitle));
wsprintf(szMessage, szTitle, (CHAR)('A' + iCurrentDrive), '.');
SetDlgItemText(hDlg, IDD_DRIVE, szMessage);
}
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDCANCEL:
bUserAbort = TRUE;
break;
default:
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}
// update all the windows and things after drives have been connected
// or disconnected.
VOID
APIENTRY
UpdateConnections()
{
HWND hwnd, hwndNext;
INT i, iDrive;
HCURSOR hCursor;
hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
ShowCursor(TRUE);
cDrives = UpdateDriveList(); // updates rgiDrive[]
InitDriveBitmaps();
// close all windows that have the current drive set to
// the one we just disconnected
for (hwnd = GetWindow(hwndMDIClient, GW_CHILD); hwnd; hwnd = hwndNext) {
hwndNext = GetWindow(hwnd, GW_HWNDNEXT);
// ignore the titles and search window
if (GetWindow(hwnd, GW_OWNER) || hwnd == hwndSearch)
continue;
iDrive = GetWindowLong(hwnd, GWL_TYPE);
if (IsValidDisk(iDrive)) {
// refresh drive bar only
SendMessage(hwnd, FS_CHANGEDRIVES, 0, 0L);
} else {
// this drive has gone away
if (IsLastWindow()) {
// disconecting the last drive
// set this guy to the first non floppy
for (i = 0; i < cDrives; i++) {
if (!IsRemovableDrive(rgiDrive[i])) {
SendMessage(HasDrivesWindow(hwnd), FS_SETDRIVE, i, 0L);
break;
}
}
} else
SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0L);
}
}
ShowCursor(FALSE);
SetCursor(hCursor);
}
BOOL
DisconnectDrive(
HWND hDlg,
INT iDrive
)
{
CHAR szTemp[MAXPATHLEN];
CHAR szDrive[5];
INT ret, nIsNet;
// don't allow disconnecting from the system directory
GetSystemDirectory(szTemp, sizeof(szTemp));
SheChangeDir(szTemp); // to fix confused lanman
if (iDrive == (INT)(*szTemp - 'A')) {
LoadString(hAppInstance, IDS_NETERR, szTitle, sizeof(szTitle));
LoadString(hAppInstance, IDS_NETDISCONWINERR, szMessage, sizeof(szMessage));
MessageBox(hDlg, szMessage, szTitle, MB_OK | MB_ICONSTOP);
return FALSE;
}
lstrcpy(szDrive, "A:");
szDrive[0] = (CHAR)('A'+iDrive);
nIsNet = IsNetDrive((WORD)iDrive);
ret = WNetCancelConnection(szDrive, FALSE); // don't force this
// remove from the permanent connection list (even in error case)
WriteProfileString(szNetwork, szDrive, szNULL);
if (nIsNet != 2 && ret != WN_SUCCESS && ret != WN_NOT_CONNECTED) {
LoadString(hAppInstance, IDS_NETERR, szTitle, sizeof(szTitle));
if (ret == WN_OPEN_FILES)
LoadString(hAppInstance, (UINT)IDS_NETDISCONOPEN, szMessage, sizeof(szMessage));
else
WNetErrorText((WORD)ret, szMessage, sizeof(szMessage));
MessageBox(hDlg, szMessage, szTitle, MB_OK | MB_ICONSTOP);
return FALSE;
}
return TRUE;
}
VOID
FillDrives(
HWND hDlg
)
{
INT i, iDrive, count = 0;
CHAR szDrive[4];
CHAR szTemp[120];
HWND hwndLB, hwndCB;
hwndLB = GetDlgItem(hDlg, IDD_DRIVE1);
hwndCB = GetDlgItem(hDlg, IDD_DRIVE);
SendMessage(hwndCB, CB_RESETCONTENT, 0, 0L);
SendMessage(hwndLB, LB_RESETCONTENT, 0, 0L);
// fill the list of drives to connect to...
lstrcpy(szDrive, "A:");
iDrive = 0;
for (i = 0; i < 26; i++) {
if (rgiDrive[iDrive] == i) {
iDrive++;
} else {
if (i == 1)
continue; // skip B:?
szDrive[0] = (CHAR)('A'+i);
// WN_BAD_LOCALNAME means the drive is not sutable for
// making a connection to (lastdrive limit, etc).
if (WFGetConnection(szDrive, szTemp, TRUE) == WN_BAD_LOCALNAME)
continue;
SendMessage(hwndCB, CB_INSERTSTRING, -1, (LPARAM)szDrive);
}
}
SendMessage(hwndCB, CB_SETCURSEL, 0, 0L);
SendMessage(hwndLB, WM_SETREDRAW, FALSE, 0L);
for (i = 0; i < cDrives; i++) {
if (IsRemoteDrive(rgiDrive[i])) {
szTemp[0] = (CHAR)('A' + rgiDrive[i]);
szTemp[1] = ':';
szTemp[2] = 0;
lstrcpy(szDrive,szTemp);
szTemp[2] = ' ';
if (WFGetConnection(szDrive, szTemp+3, FALSE) != WN_SUCCESS)
continue;
count++;
SendMessage(hwndLB, LB_INSERTSTRING, -1, (LPARAM)szTemp);
}
}
SendMessage(hwndLB, WM_SETREDRAW, TRUE, 0L);
InvalidateRect(hwndLB, NULL, TRUE);
SendMessage(hwndLB, LB_SETCURSEL, 0, 0L);
EnableWindow(GetDlgItem(hDlg, IDD_DISCONNECT), count);
}
LPSTR pszPrevPath;
/*--------------------------------------------------------------------------*/
/* */
/* ConnectDlgProc() - */
/* */
/*--------------------------------------------------------------------------*/
INT_PTR
APIENTRY
ConnectDlgProc(
register HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
BOOL bPrevs;
CHAR szDrive[4];
CHAR szPath[WNBD_MAX_LENGTH], szPathSave[WNBD_MAX_LENGTH];
CHAR szPassword[32];
HCURSOR hCursor;
switch (wMsg) {
case WM_INITDIALOG:
hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
ShowCursor(TRUE);
FillDrives(hDlg);
if (!(WNetGetCaps(WNNC_CONNECTION) & WNNC_CON_BROWSEDIALOG))
EnableWindow(GetDlgItem(hDlg, IDD_NETBROWSE), FALSE);
SendDlgItemMessage(hDlg, IDD_PATH, EM_LIMITTEXT, sizeof(szPath)-1, 0L);
SendDlgItemMessage(hDlg, IDD_PASSWORD, EM_LIMITTEXT, sizeof(szPassword)-1, 0L);
/* Are there any Previous connections? */
bPrevs = (GetPrivateProfileString(szPrevious, NULL, szNULL,
szPath, sizeof(szPath)-1, szTheINIFile) != 0);
EnableWindow(GetDlgItem(hDlg, IDD_PREV), bPrevs);
ShowCursor(FALSE);
SetCursor(hCursor);
break;
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDD_HELP:
goto DoHelp;
case IDOK:
{
HCURSOR hCursor;
LPSTR p;
UINT id;
hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
ShowCursor(TRUE);
GetDlgItemText(hDlg, IDD_DRIVE, szDrive, sizeof(szDrive));
GetDlgItemText(hDlg, IDD_PATH, szPath, sizeof(szPath));
GetDlgItemText(hDlg, IDD_PASSWORD, szPassword, sizeof(szPassword));
lstrcpy(szPathSave, szPath); // may have comments
// support saving extra stuff after the first double space
// put a NULL in at the first double space
p = szPath;
while (*p && *p != ' ')
p = AnsiNext(p);
if (*(p + 1) == ' ')
*p = 0;
if ((id = WNetAddConnection(szPath, szPassword, szDrive)) != WN_SUCCESS) {
ShowCursor(FALSE);
SetCursor(hCursor);
LoadString(hAppInstance, IDS_NETERR, szTitle, sizeof(szTitle));
WNetErrorText(id, szMessage, sizeof(szMessage));
MessageBox(hDlg, szMessage, szTitle, MB_OK | MB_ICONSTOP);
break;
}
UpdateConnections();
InvalidateVolTypes();
FillDrives(hDlg);
SetDlgItemText(hDlg, IDD_PATH, szNULL);
SetDlgItemText(hDlg, IDD_PASSWORD, szNULL);
// always add to previous...
WritePrivateProfileString(szPrevious, szPathSave, szNULL, szTheINIFile);
// store the connection in win.ini for reconect at
// startup if the winnet driver does not support this
// itself
//
// allow SHIFT to make the connection not permenent
if (!(WNetGetCaps(WNNC_CONNECTION) & WNNC_CON_RESTORECONNECTION) &&
(GetKeyState(VK_SHIFT) >= 0))
WriteProfileString(szNetwork, szDrive, szPath);
ShowCursor(FALSE);
SetCursor(hCursor);
break;
}
case IDCANCEL:
EndDialog(hDlg, TRUE);
break;
case IDD_NETBROWSE:
// if (WNetBrowseDialog(hDlg, WNBD_CONN_DISKTREE, szPath) == WN_SUCCESS)
// SetDlgItemText(hDlg, IDD_PATH, szPath);
break;
case IDD_DISCONNECT:
hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
ShowCursor(TRUE);
wParam = (WPARAM)SendDlgItemMessage(hDlg, IDD_DRIVE1, LB_GETCURSEL, 0, 0L);
SendDlgItemMessage(hDlg, IDD_DRIVE1, LB_GETTEXT, wParam, (LPARAM)szPath);
if (DisconnectDrive(hDlg, (INT)(szPath[0] - 'A'))) {
SendDlgItemMessage(hDlg, IDD_DRIVE1, LB_DELETESTRING, wParam, 0L);
UpdateConnections();
FillDrives(hDlg);
SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg, IDD_PATH), 1L);
}
ShowCursor(FALSE);
SetCursor(hCursor);
break;
case IDD_PREV:
{
DWORD dwSave = dwContext;
dwContext = IDH_DLG_PREV;
pszPrevPath = szPath;
if (DialogBox(hAppInstance, MAKEINTRESOURCE(PREVIOUSDLG), hDlg, PreviousDlgProc) > 0) {
SetDlgItemText(hDlg, IDD_PATH, pszPrevPath);
GetPrivateProfileString(szPrevious, pszPrevPath, szNULL, szPassword, 12, szTheINIFile);
SetDlgItemText(hDlg, IDD_PASSWORD, szNULL);
SendMessage(hDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlg, IDD_PASSWORD), 1L);
}
dwContext = dwSave;
break;
}
case IDD_DRIVE:
if (GET_WM_COMMAND_CMD(wParam, lParam) == CBN_SELCHANGE) {
if (GetDlgItemText(hDlg,IDD_DRIVE,szDrive,3)) {
if (WFGetConnection(szDrive,szPath,FALSE) == WN_SUCCESS)
SetDlgItemText(hDlg,IDD_PATH,szPath);
}
}
break;
case IDD_PATH:
if (!(wParam = GetDlgItemText(hDlg,IDD_PATH,szPath,64)) &&
GetFocus()==GetDlgItem(hDlg, IDOK))
SendMessage(hDlg, WM_NEXTDLGCTL,
(WPARAM)GetDlgItem(hDlg, IDCANCEL), 1L);
EnableWindow(GetDlgItem(hDlg,IDOK),wParam ? TRUE : FALSE);
SendMessage(hDlg, DM_SETDEFID, wParam ? IDOK : IDCANCEL, 0L);
break;
default:
return FALSE;
}
break;
default:
if (wMsg == wHelpMessage) {
DoHelp:
WFHelp(hDlg);
return TRUE;
} else
return FALSE;
}
return TRUE;
}
INT_PTR
APIENTRY
DrivesDlgProc(
HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
INT nDrive, iSel;
HWND hwndDrives, hwndActive;
CHAR szTemp[MAXPATHLEN];
CHAR szVolShare[MAXPATHLEN];
UNREFERENCED_PARAMETER(lParam);
switch (wMsg) {
case WM_INITDIALOG:
{
INT nCurDrive;
INT nIndex;
nCurDrive = GetSelectedDrive();
nIndex = 0;
for (nDrive=0; nDrive < cDrives; nDrive++) {
if (IsRemovableDrive(rgiDrive[nDrive])) // avoid flopies
szVolShare[0] = (CHAR)NULL;
else
GetVolShare((WORD)rgiDrive[nDrive], szVolShare);
if (nCurDrive == rgiDrive[nDrive])
nIndex = nDrive;
wsprintf(szTemp, "%c: %s", rgiDrive[nDrive] + 'A', (LPSTR)szVolShare);
SendDlgItemMessage(hDlg, IDD_DRIVE, LB_ADDSTRING, 0, (LPARAM)szTemp);
}
SendDlgItemMessage(hDlg, IDD_DRIVE, LB_SETCURSEL, nIndex, 0L);
break;
}
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDD_HELP:
goto DoHelp;
case IDD_DRIVE:
if (GET_WM_COMMAND_CMD(wParam, lParam) != LBN_DBLCLK)
break;
// fall through
case IDOK:
iSel = (INT)SendDlgItemMessage(hDlg, IDD_DRIVE, LB_GETCURSEL, 0, 0L);
EndDialog(hDlg, TRUE);
hwndActive = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0L);
if (hwndDrives = HasDrivesWindow(hwndActive)) {
SendMessage(hwndDrives, FS_SETDRIVE, iSel, 0L);
}
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
}
break;
default:
if (wMsg == wHelpMessage) {
DoHelp:
WFHelp(hDlg);
return TRUE;
} else
return FALSE;
}
return TRUE;
}
/*--------------------------------------------------------------------------*/
/* */
/* PreviousDlgProc() - */
/* */
/*--------------------------------------------------------------------------*/
INT_PTR
APIENTRY
PreviousDlgProc(
register HWND hDlg,
UINT wMsg,
WPARAM wParam,
LPARAM lParam
)
{
HWND hwndLB;
INT iSel;
CHAR szTemp[64];
hwndLB = GetDlgItem(hDlg, IDD_PREV);
switch (wMsg) {
case WM_INITDIALOG:
{
WORD nSize;
LPSTR pstrT;
LPSTR szBuffer;
/*** FIX30: We should be able to process a partial buffer here. ***/
/* Get the connections out of WINFILE.INI. */
nSize = 256;
if (!(szBuffer = (LPSTR)LocalAlloc(LPTR, nSize))) {
PreviousDlgExit:
EndDialog(hDlg, FALSE);
break;
}
while ((INT)GetPrivateProfileString(szPrevious,
NULL, szNULL,
szBuffer, nSize,
szTheINIFile) == (INT)nSize-2) {
nSize += 512;
LocalFree((HANDLE)szBuffer);
if (!(szBuffer = (LPSTR)LocalAlloc(LPTR, nSize)))
goto PreviousDlgExit;
}
/* Put the connections into the list box. */
pstrT = szBuffer;
while (*pstrT) {
SendMessage(hwndLB, LB_ADDSTRING, 0, (LPARAM)pstrT);
while (*pstrT)
pstrT++;
pstrT++;
}
LocalFree((HANDLE)szBuffer);
SendMessage(hwndLB, LB_SETCURSEL, 0, 0L);
break;
}
case WM_COMMAND:
switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDD_HELP:
goto DoHelp;
case IDD_DELETE:
iSel = (INT)SendMessage(hwndLB, LB_GETCURSEL, 0, 0L);
if (iSel == LB_ERR)
break;
SendMessage(hwndLB, LB_GETTEXT, iSel, (LPARAM)szTemp);
SendMessage(hwndLB, LB_DELETESTRING, iSel, 0L);
SendMessage(hwndLB, LB_SETCURSEL, 0, 0L);
WritePrivateProfileString(szPrevious, szTemp, NULL, szTheINIFile);
break;
case IDD_PREV:
if (GET_WM_COMMAND_CMD(wParam, lParam) != LBN_DBLCLK)
return FALSE;
/*** FALL THRU ***/
case IDOK:
// return the selection through this global
*pszPrevPath = TEXT('\0');
iSel = (INT)SendMessage(hwndLB, LB_GETCURSEL, 0, 0L);
if (iSel != LB_ERR)
SendMessage(hwndLB, LB_GETTEXT, iSel, (LPARAM)pszPrevPath);
EndDialog(hDlg, TRUE);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
default:
return FALSE;
}
break;
default:
if (wMsg == wHelpMessage) {
DoHelp:
WFHelp(hDlg);
return TRUE;
} else
return FALSE;
}
return TRUE;
}