|
|
/*
+-------------------------------------------------------------------------+ | File Operations | +-------------------------------------------------------------------------+ | (c) Copyright 1994 | | Microsoft Corp. | | All rights reserved | | | | Program : [FileDLG.c] | | Programmer : Arthur Hanson | | Original Program Date : [Feb 10, 1994] | | Last Update : [Jun 16, 1994] | | | | Version: 1.00 | | | | Description: | | | | History: | | arth Feb 10, 1994 1.00 Original Version. | | | +-------------------------------------------------------------------------+ */
#include "globals.h"
#include "convapi.h"
#include "filedlg.h"
#include "ntnetapi.h"
#include "nwnetapi.h"
#include "columnlb.h"
static SOURCE_SERVER_BUFFER *SServ; static DEST_SERVER_BUFFER *DServ;
static FILE_OPTIONS *FileOptions; static SHARE_LIST *ShareList; static SHARE_BUFFER *SList; static SHARE_BUFFER *CurrentShare; static SHARE_BUFFER *CurrentDShare; static int SelectType; static int NewShareType;
#define SELECT_TYPE_MODIFY 1
#define SELECT_TYPE_ADD 2
static BOOL ConvertFiles = TRUE;
void FileSelect_Do(HWND hDlg, SOURCE_SERVER_BUFFER *SourceServ, SHARE_BUFFER *CShare); BOOL MapShare(SHARE_BUFFER *Share, DEST_SERVER_BUFFER *DServ);
/*+-------------------------------------------------------------------------+
| FileOptionsDefaultsSet() | +-------------------------------------------------------------------------+*/ void FileOptionsDefaultsSet(void *tfo) { FILE_OPTIONS *fo = tfo;
if (fo->TransferFileInfo) ConvertFiles = TRUE; else ConvertFiles = FALSE;
} // FileOptionsDefaultsSet
/*+-------------------------------------------------------------------------+
| FileOptionsDefaultsReset() | +-------------------------------------------------------------------------+*/ void FileOptionsDefaultsReset() { ConvertFiles = TRUE;
} // FileOptionsDefaultsReset
/*+-------------------------------------------------------------------------+
| FileOptionsInit() | +-------------------------------------------------------------------------+*/ void FileOptionsInit(void **lpfo) { FILE_OPTIONS *fo;
fo = (FILE_OPTIONS *) *lpfo;
// if we need to allocate space, do so
if (fo == NULL) fo = AllocMemory(sizeof(FILE_OPTIONS));
// make sure it was allocated
if (fo == NULL) return;
memset(fo, 0, sizeof(FILE_OPTIONS)); fo->TransferFileInfo = ConvertFiles; *lpfo = (void *) fo;
} // FileOptionsInit
/*+-------------------------------------------------------------------------+
| FileOptionsLoad() | +-------------------------------------------------------------------------+*/ void FileOptionsLoad(HANDLE hFile, void **lpfo) { FILE_OPTIONS *fo; DWORD wrote;
fo = (FILE_OPTIONS *) *lpfo;
// if we need to allocate space, do so
if (fo == NULL) fo = AllocMemory(sizeof(FILE_OPTIONS));
// make sure it was allocated
if (fo == NULL) return;
ReadFile(hFile, fo, sizeof(FILE_OPTIONS), &wrote, NULL); *lpfo = (void *) fo;
} // FileOptionsLoad
/*+-------------------------------------------------------------------------+
| FileOptionsSave() | +-------------------------------------------------------------------------+*/ void FileOptionsSave(HANDLE hFile, void *fo) { DWORD wrote;
WriteFile(hFile, fo, sizeof(FILE_OPTIONS), &wrote, NULL);
} // FileOptionsSave
/*+-------------------------------------------------------------------------+
| Share Modify/Create Dialog Routines | +-------------------------------------------------------------------------+*/
/*+-------------------------------------------------------------------------+
| ShareNewPathValidate() | +-------------------------------------------------------------------------+*/ BOOL ShareNewPathValidate(HWND hWnd, LPTSTR Path, DRIVE_BUFFER **pDrive) { VIRTUAL_SHARE_BUFFER *VShare; DRIVE_BUFFER *DList; ULONG i; TCHAR Drive[2];
// must be long enough to hold drive, colon and path
if (lstrlen(Path) < 3) goto ShareNewValidateFail;
if (Path[1] != TEXT(':')) goto ShareNewValidateFail;
if (Path[2] != TEXT('\\')) goto ShareNewValidateFail;
if (DServ->DriveList == NULL) return FALSE;
// Scan drive list looking for match to share path
Drive[1] = TEXT('\0'); DList = DServ->DriveList->DList; for (i = 0; i < DServ->DriveList->Count; i++) { // Get first char from path - should be drive letter
Drive[0] = Path[0]; if (!lstrcmpi(Drive, DList[i].Drive)) { // Found match
*pDrive = &DList[i];
if (NewShareType == SELECT_TYPE_MODIFY) if (CurrentDShare->VFlag) { VShare = (VIRTUAL_SHARE_BUFFER *) CurrentDShare; VShare->Drive = &DList[i]; } else CurrentDShare->Drive = &DList[i];
return TRUE; } }
ShareNewValidateFail: MessageBox(hWnd, Lids(IDS_E_3), Lids(IDS_E_2), MB_OK); return FALSE;
} // ShareNewPathValidate
/*+-------------------------------------------------------------------------+
| ShareNewShareValidate() | +-------------------------------------------------------------------------+*/ BOOL ShareNewShareValidate(HWND hWnd, LPTSTR ShareName) { ULONG i; VIRTUAL_SHARE_BUFFER *VShare; SHARE_BUFFER *VList;
// Loop through share list seeing if the share already exists (same name)
if (DServ->ShareList != NULL) { VList = DServ->ShareList->SList;
for (i = 0; i < DServ->ShareList->Count; i++) if (!lstrcmpi(VList[i].Name, ShareName)) goto ShareNewShareVFail;
}
// Now do the same for the virtual share list
VShare = DServ->VShareStart; while (VShare) {
if (!lstrcmpi(VShare->Name, ShareName)) goto ShareNewShareVFail;
VShare = VShare->next; }
return TRUE;
ShareNewShareVFail: MessageBox(hWnd, Lids(IDS_E_4), Lids(IDS_E_2), MB_OK); return FALSE;
} // ShareNewShareValidate
/*+-------------------------------------------------------------------------+
| NWShareNew() | +-------------------------------------------------------------------------+*/ LRESULT CALLBACK NWShareNew(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND hCtrl; BOOL Enable; int wmId, wmEvent; TCHAR Path[MAX_PATH + 1]; TCHAR NewShare[MAX_SHARE_NAME_LEN + 1]; VIRTUAL_SHARE_BUFFER *VShare; DRIVE_BUFFER *Drive; BOOL ok;
switch (message) { case WM_INITDIALOG: // Center the dialog over the application window
CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));
hCtrl = GetDlgItem(hDlg, IDC_EDIT1); PostMessage(hCtrl, EM_LIMITTEXT, (WPARAM) MAX_SHARE_NAME_LEN, 0); hCtrl = GetDlgItem(hDlg, IDC_EDIT2); PostMessage(hCtrl, EM_LIMITTEXT, (WPARAM) MAX_PATH, 0);
if (NewShareType == SELECT_TYPE_MODIFY) { SendMessage(hDlg, WM_SETTEXT, (WPARAM) 0, (LPARAM) Lids(IDS_D_5)); hCtrl = GetDlgItem(hDlg, IDC_EDIT1); EnableWindow(hCtrl, FALSE); ShowWindow(hCtrl, SW_HIDE);
hCtrl = GetDlgItem(hDlg, IDC_SHARENAME); if (CurrentDShare->VFlag) { VShare = (VIRTUAL_SHARE_BUFFER *) CurrentDShare; SendMessage(hCtrl, WM_SETTEXT, (WPARAM) 0, (LPARAM) VShare->Name); } else SendMessage(hCtrl, WM_SETTEXT, (WPARAM) 0, (LPARAM) CurrentDShare->Name);
} else { hCtrl = GetDlgItem(hDlg, IDC_SHARENAME); EnableWindow(hCtrl, FALSE); ShowWindow(hCtrl, SW_HIDE);
hCtrl = GetDlgItem(hDlg, IDOK); EnableWindow(hCtrl, FALSE); }
PostMessage(hDlg, WM_COMMAND, ID_INIT, 0L); return (TRUE);
case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam);
switch (wmId) {
case IDOK: ok = TRUE;
if (NewShareType == SELECT_TYPE_ADD) { hCtrl = GetDlgItem(hDlg, IDC_EDIT1); * (WORD *)NewShare = sizeof(NewShare); SendMessage(hCtrl, EM_GETLINE, 0, (LPARAM) NewShare);
if (!ShareNewShareValidate(hDlg, NewShare)) ok = FALSE; }
if (ok) { hCtrl = GetDlgItem(hDlg, IDC_EDIT2); * (WORD *)Path = sizeof(Path); SendMessage(hCtrl, EM_GETLINE, 0, (LPARAM) Path);
if (!ShareNewPathValidate(hDlg, Path, &Drive)) ok = FALSE; } if (ok) { if (NewShareType == SELECT_TYPE_ADD) { // If we are in ADD - then we might have added a virtual
// share when we did the match, if so get rid of it...
if ((CurrentShare !=NULL) && (CurrentShare->DestShare != NULL)) if (CurrentShare->Virtual) { VShare = (VIRTUAL_SHARE_BUFFER *) CurrentShare->DestShare; VShareListDelete(DServ, VShare); CurrentShare->DestShare = NULL; }
// Got rid of old one, now need to create new one.
CurrentShare->Virtual = TRUE; VShare = VShareListAdd(DServ, NewShare, Path); VShare->Drive = Drive; VShare->UseCount++; CurrentShare->DestShare = (SHARE_BUFFER *) VShare; CurrentDShare = (SHARE_BUFFER *) VShare; } else // Modify so update the values of the path/drive with
// the new stuff.
if ((CurrentShare !=NULL) && (CurrentShare->DestShare != NULL)) if (CurrentShare->Virtual) { VShare = (VIRTUAL_SHARE_BUFFER *) CurrentShare->DestShare; lstrcpy(VShare->Path, Path); VShare->Drive = Drive; }
EndDialog(hDlg, 0); }
break;
case IDCANCEL: EndDialog(hDlg, 0); break;
case IDHELP: if (NewShareType == SELECT_TYPE_MODIFY) WinHelp(hDlg, HELP_FILE, HELP_CONTEXT, (DWORD) IDC_HELP_SHAREPROP); else WinHelp(hDlg, HELP_FILE, HELP_CONTEXT, (DWORD) IDC_HELP_SHARENEW);
break;
case ID_INIT: // Modify should only be for a virtual share
if (NewShareType == SELECT_TYPE_MODIFY) { hCtrl = GetDlgItem(hDlg, IDC_EDIT2); if (CurrentDShare->VFlag) { VShare = (VIRTUAL_SHARE_BUFFER *) CurrentDShare; SendMessage(hCtrl, WM_SETTEXT, (WPARAM) 0, (LPARAM) VShare->Path); } }
case IDC_EDIT1: case IDC_EDIT2: if (wmEvent == EN_CHANGE) { Enable = TRUE; hCtrl = GetDlgItem(hDlg, IDC_EDIT1); if (NewShareType == SELECT_TYPE_ADD) if (!SendMessage(hCtrl, EM_LINELENGTH, 0, 0)) Enable = FALSE;
hCtrl = GetDlgItem(hDlg, IDC_EDIT2); if (SendMessage(hCtrl, EM_LINELENGTH, 0, 0) < 3) Enable = FALSE;
hCtrl = GetDlgItem(hDlg, IDOK); EnableWindow(hCtrl, Enable);
} break;
} return TRUE;
}
return (FALSE); // Didn't process the message
lParam; } // NWShareNew
/*+-------------------------------------------------------------------------+
| NWShareNew_Do() | +-------------------------------------------------------------------------+*/ void NWShareNew_Do(HWND hDlg) { DLGPROC lpfnDlg;
lpfnDlg = MakeProcInstance( (DLGPROC) NWShareNew, hInst); DialogBox(hInst, TEXT("NWShareAdd"), hDlg, lpfnDlg) ; FreeProcInstance(lpfnDlg);
} // NWShareNew_Do
/*+-------------------------------------------------------------------------+
| Add / Modify Share Selection Dialog Routines | +-------------------------------------------------------------------------+*/
/*+-------------------------------------------------------------------------+
| FixShare() | +-------------------------------------------------------------------------+*/ void FixShare(LPTSTR OrigShare, LPTSTR ServName, LPTSTR DestShare) { LPTSTR pShare = OrigShare;
lstrcpy(DestShare, TEXT(""));
// Assume it is in the form \\server\share
// Skip over leading double-back for server
if ((pShare[0] == '\\') && (pShare[1] == '\\')) pShare+= 2;
// Now skip over the server name
while (*pShare && (*pShare != '\\')) pShare++;
// pShare should point to the share-name, append this to the server-name
if (*ServName != '\\') lstrcat(DestShare, TEXT("\\\\"));
lstrcat(DestShare, ServName); lstrcat(DestShare, pShare);
} // FixShare
/*+-------------------------------------------------------------------------+
| NTShareListFill() | +-------------------------------------------------------------------------+*/ void NTShareListFill(HWND hDlg) { HWND hCtrl; SHARE_LIST *ShareList = NULL; SHARE_BUFFER *SList; DWORD_PTR i, dwIndex; BOOL Match = FALSE; VIRTUAL_SHARE_BUFFER *VShare;
// Clear it out
hCtrl = GetDlgItem(hDlg, IDC_COMBO2); SendMessage(hCtrl, CB_RESETCONTENT, 0, 0L);
// First enum all the regular shares
ShareList = DServ->ShareList; if (ShareList != NULL) { SList = ShareList->SList;
for (i = 0; i < ShareList->Count; i++) { dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) SList[i].Name); SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) &SList[i]); }
}
// Now enum all the virtual shares
VShare = DServ->VShareStart; while (VShare) { dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) VShare->Name); SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) VShare); VShare = VShare->next; }
// Match the combo-box to the given share
if (CurrentShare->DestShare != NULL) if (CurrentShare->Virtual) { VShare = (VIRTUAL_SHARE_BUFFER *) CurrentShare->DestShare; SendMessage(hCtrl, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) VShare->Name); } else SendMessage(hCtrl, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) CurrentShare->DestShare->Name);
} // NTShareListFill
/*+-------------------------------------------------------------------------+
| NWShareSelect() | +-------------------------------------------------------------------------+*/ LRESULT CALLBACK NWShareSelect(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static TCHAR ServName[MAX_UNC_PATH+1]; VIRTUAL_SHARE_BUFFER *VShare; SHARE_BUFFER *OrigShare = NULL; SHARE_BUFFER *NewShare; HWND hCtrl; DWORD_PTR dwData,dwIndex; int wmId, wmEvent; ULONG i;
switch (message) { case WM_INITDIALOG: // Center the dialog over the application window
CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));
if (SelectType == SELECT_TYPE_MODIFY) { SendMessage(hDlg, WM_SETTEXT, (WPARAM) 0, (LPARAM) Lids(IDS_D_6)); // Disable Source combo box...
hCtrl = GetDlgItem(hDlg, IDC_COMBO1); EnableWindow(hCtrl, FALSE); ShowWindow(hCtrl, SW_HIDE); OrigShare = CurrentShare->DestShare; }
hCtrl = GetDlgItem(hDlg, IDC_FSERVER); lstrcpy(ServName, Lids(IDS_D_7)); lstrcat(ServName, SServ->Name); SendMessage(hCtrl, WM_SETTEXT, (WPARAM) 0, (LPARAM) ServName);
hCtrl = GetDlgItem(hDlg, IDC_TSERVER); lstrcpy(ServName, Lids(IDS_D_8)); lstrcat(ServName, DServ->Name); SendMessage(hCtrl, WM_SETTEXT, (WPARAM) 0, (LPARAM) ServName);
PostMessage(hDlg, WM_COMMAND, ID_INIT, 0L);
hCtrl = GetDlgItem(hDlg, IDC_EDIT1); PostMessage(hCtrl, EM_LIMITTEXT, (WPARAM) MAX_PATH, 0);
if (SelectType == SELECT_TYPE_MODIFY) SendMessage(hCtrl, WM_SETTEXT, (WPARAM) 0, (LPARAM) CurrentShare->SubDir);
return (TRUE);
case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam);
switch (wmId) {
case IDOK: CurrentShare->Convert = TRUE; // only really needed for add
hCtrl = GetDlgItem(hDlg, IDC_COMBO2); dwIndex = SendMessage(hCtrl, CB_GETCURSEL, 0, 0L);
if (dwIndex != CB_ERR) { dwData = SendMessage(hCtrl, CB_GETITEMDATA, dwIndex, 0L); NewShare = (SHARE_BUFFER *) dwData;
if (OrigShare != NewShare) { CurrentShare->DestShare = NewShare;
// this is actually a flag for the destination share
CurrentShare->Virtual = NewShare->VFlag; } }
hCtrl = GetDlgItem(hDlg, IDC_EDIT1); * (WORD *)CurrentShare->SubDir = sizeof(CurrentShare->SubDir); SendMessage(hCtrl, EM_GETLINE, 0, (LPARAM) CurrentShare->SubDir);
EndDialog(hDlg, 0); break;
case IDCANCEL: if (SelectType == SELECT_TYPE_ADD) {
// If we are in ADD - then we might have added a virtual
// share when we did the match, if so get rid of it...
if ((CurrentShare !=NULL) && (CurrentShare->DestShare != NULL)) if (CurrentShare->Virtual) { VShare = (VIRTUAL_SHARE_BUFFER *) CurrentShare->DestShare; VShareListDelete(DServ, VShare); CurrentShare->DestShare = NULL; }
CurrentShare = NULL; }
EndDialog(hDlg, 0); break;
case IDHELP: if (SelectType == SELECT_TYPE_MODIFY) WinHelp(hDlg, HELP_FILE, HELP_CONTEXT, (DWORD) IDC_HELP_SHAREMOD); else WinHelp(hDlg, HELP_FILE, HELP_CONTEXT, (DWORD) IDC_HELP_SHAREADD); break;
case IDC_NEWSHARE: CurrentDShare = NULL; NewShareType = SELECT_TYPE_ADD; NWShareNew_Do(hDlg);
// Match the combo-box to the given share
NTShareListFill(hDlg); PostMessage(hDlg, WM_COMMAND, ID_UPDATECOMBO, 0L); break;
case IDC_PROPERTIES: NewShareType = SELECT_TYPE_MODIFY; hCtrl = GetDlgItem(hDlg, IDC_COMBO2); dwIndex = SendMessage(hCtrl, CB_GETCURSEL, 0, 0L);
if (dwIndex != CB_ERR) { dwData = SendMessage(hCtrl, CB_GETITEMDATA, dwIndex, 0L); CurrentDShare = (SHARE_BUFFER *) dwData; NWShareNew_Do(hDlg); }
break;
case ID_INIT: if (SelectType == SELECT_TYPE_ADD) { hCtrl = GetDlgItem(hDlg, IDC_COMBO1);
if (ShareList == NULL) break;
CurrentShare = NULL; for (i = 0; i < ShareList->Count; i++) if (!SList[i].Convert) { if (CurrentShare == NULL) CurrentShare = &SList[i];
dwIndex = SendMessage(hCtrl, CB_ADDSTRING, (WPARAM) 0, (LPARAM) SList[i].Name); SendMessage(hCtrl, CB_SETITEMDATA, (WPARAM) dwIndex, (LPARAM) &SList[i]); }
if (CurrentShare != NULL) { SendMessage(hCtrl, CB_SELECTSTRING, (WPARAM) -1, (LPARAM) CurrentShare->Name); MapShare(CurrentShare, DServ); }
} else { // Display the static text
hCtrl = GetDlgItem(hDlg, IDC_VOLUME); EnableWindow(hCtrl, TRUE); ShowWindow(hCtrl, SW_SHOW); SendMessage(hCtrl, WM_SETTEXT, (WPARAM) 0, (LPARAM) CurrentShare->Name); }
NTShareListFill(hDlg); PostMessage(hDlg, WM_COMMAND, ID_UPDATECOMBO, 0L); break;
// Used to update which volume we are pointing at
case ID_UPDATELIST: // We might have added a virtual share when we did the
// match, if so get rid of it...
if ((CurrentShare !=NULL) && (CurrentShare->DestShare != NULL)) if (CurrentShare->Virtual) { VShare = (VIRTUAL_SHARE_BUFFER *) CurrentShare->DestShare; VShareListDelete(DServ, VShare); CurrentShare->DestShare = NULL; }
hCtrl = GetDlgItem(hDlg, IDC_COMBO1); dwIndex = SendMessage(hCtrl, CB_GETCURSEL, 0, 0L);
if (dwIndex != CB_ERR) { dwData = SendMessage(hCtrl, CB_GETITEMDATA, dwIndex, 0L); CurrentShare = (SHARE_BUFFER *) dwData;
// Now need to map this to a new share
if (CurrentShare != NULL) { MapShare(CurrentShare, DServ);
// Match the combo-box to the given share
NTShareListFill(hDlg); } }
break;
// updateded the share list selection
case ID_UPDATECOMBO: hCtrl = GetDlgItem(hDlg, IDC_COMBO2); dwIndex = SendMessage(hCtrl, CB_GETCURSEL, 0, 0L);
if (dwIndex != CB_ERR) { dwData = SendMessage(hCtrl, CB_GETITEMDATA, dwIndex, 0L); CurrentDShare = (SHARE_BUFFER *) dwData; hCtrl = GetDlgItem(hDlg, IDC_PROPERTIES);
if (CurrentDShare->VFlag) { EnableWindow(hCtrl, TRUE); } else { EnableWindow(hCtrl, FALSE); }
} break;
case IDC_COMBO1: if (wmEvent == CBN_SELCHANGE) PostMessage(hDlg, WM_COMMAND, ID_UPDATELIST, 0L);
break;
case IDC_COMBO2: if (wmEvent == CBN_SELCHANGE) PostMessage(hDlg, WM_COMMAND, ID_UPDATECOMBO, 0L);
break; } return TRUE;
}
return (FALSE); // Didn't process the message
lParam; } // NWShareSelect
/*+-------------------------------------------------------------------------+
| ShareSelect_Do() | +-------------------------------------------------------------------------+*/ void NWShareSelect_Do(HWND hDlg) { DLGPROC lpfnDlg;
lpfnDlg = MakeProcInstance((DLGPROC)NWShareSelect, hInst); DialogBox(hInst, TEXT("NWShareSelect"), hDlg, lpfnDlg) ; FreeProcInstance(lpfnDlg);
} // NWShareSelect_Do
/*+-------------------------------------------------------------------------+
| Main File Options Dialog Routines | +-------------------------------------------------------------------------+*/
/*+-------------------------------------------------------------------------+
| FileOptionsToggleControls() | +-------------------------------------------------------------------------+*/ void FileOptionsToggleControls(HWND hDlg, BOOL Toggle) { HWND hCtrl;
hCtrl = GetDlgItem(hDlg, IDC_DELETE); EnableWindow(hCtrl, Toggle); hCtrl = GetDlgItem(hDlg, IDC_MODIFY); EnableWindow(hCtrl, Toggle); hCtrl = GetDlgItem(hDlg, IDC_FILES); EnableWindow(hCtrl, Toggle);
} // FileOptionsToggleControls
/*+-------------------------------------------------------------------------+
| FileDialogToggle() | +-------------------------------------------------------------------------+*/ void FileDialogToggle(HWND hDlg, BOOL Toggle) { HWND hCtrl;
hCtrl = GetDlgItem(hDlg, IDC_LIST1); EnableWindow(hCtrl, Toggle); FileOptionsToggleControls(hDlg, Toggle);
hCtrl = GetDlgItem(hDlg, IDC_ADD); if (Toggle == FALSE) EnableWindow(hCtrl, FALSE); else if (ShareList && ShareList->Count != ShareList->ConvertCount) EnableWindow(hCtrl, TRUE); else EnableWindow(hCtrl, FALSE);
} // FileDialogToggle
/*+-------------------------------------------------------------------------+
| DlgFileOptions_Save() | +-------------------------------------------------------------------------+*/ void DlgFileOptions_Save(HWND hDlg) { HWND hCtrl;
hCtrl = GetDlgItem(hDlg, IDC_CHKFILES); if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == 1) FileOptions->TransferFileInfo = TRUE; else FileOptions->TransferFileInfo = FALSE;
} // DlgFileOptions_Save
/*+-------------------------------------------------------------------------+
| DlgFileOptions_Setup() | +-------------------------------------------------------------------------+*/ void DlgFileOptions_Setup(HWND hDlg) { HWND hCtrl;
hCtrl = GetDlgItem(hDlg, IDC_CHKFILES); if (FileOptions->TransferFileInfo) { SendMessage(hCtrl, BM_SETCHECK, 1, 0); FileDialogToggle(hDlg, TRUE); } else { SendMessage(hCtrl, BM_SETCHECK, 0, 0); FileDialogToggle(hDlg, FALSE); }
} // DlgFileOptions_Setup
/*+-------------------------------------------------------------------------+
| DlgFileOptions_ListboxAdd() | +-------------------------------------------------------------------------+*/ void DlgFileOptions_ListboxAdd(HWND hDlg, SHARE_BUFFER *CurrentShare, DWORD *wItem, BOOL Insert ) { HWND hCtrl; static TCHAR AddLine[256]; VIRTUAL_SHARE_BUFFER *VShare; DWORD wItemNum;
wItemNum = *wItem; hCtrl = GetDlgItem(hDlg, IDC_LIST1); if (CurrentShare->Virtual) { VShare = (VIRTUAL_SHARE_BUFFER *) CurrentShare->DestShare; wsprintf(AddLine, TEXT("%s\\%s:\t\\\\%s\\%s\t"), SServ->Name, CurrentShare->Name, DServ->Name, VShare->Name); } else wsprintf(AddLine, TEXT("%s\\%s:\t\\\\%s\\%s\t"), SServ->Name, CurrentShare->Name, DServ->Name, CurrentShare->DestShare->Name);
if (Insert) ColumnLB_InsertString(hCtrl, wItemNum, AddLine); else wItemNum = ColumnLB_AddString(hCtrl, AddLine);
ColumnLB_SetItemData(hCtrl, wItemNum, (DWORD_PTR) CurrentShare); *wItem = wItemNum;
} // DlgFileOptions_ListboxAdd
/*+-------------------------------------------------------------------------+
| DlgFileOptions() | +-------------------------------------------------------------------------+*/ LRESULT CALLBACK DlgFileOptions(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND hCtrl; DWORD wItemNum; DWORD_PTR dwData; static short FilesTab, FileOptionsTab; int wmId, wmEvent; ULONG i; SHARE_BUFFER *pShare; VIRTUAL_SHARE_BUFFER *VShare; RECT rc; int TabStop;
switch (message) { case WM_INITDIALOG: // Center the dialog over the application window
CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));
hCtrl = GetDlgItem(hDlg, IDC_LIST1); GetClientRect(hCtrl, &rc);
// Size is half width of listbox - vertical scrollbar
TabStop = (((rc.right - rc.left) - GetSystemMetrics(SM_CXVSCROLL)) / 2); ColumnLB_SetNumberCols(hCtrl, 2); ColumnLB_SetColTitle(hCtrl, 0, Lids(IDS_D_9)); ColumnLB_SetColTitle(hCtrl, 1, Lids(IDS_D_10)); ColumnLB_SetColWidth(hCtrl, 0, TabStop);
// Calculate 2nd this way instead of just using TabStop to get rid of roundoff
ColumnLB_SetColWidth(hCtrl, 1, (rc.right - rc.left) - TabStop);
DlgFileOptions_Setup(hDlg);
// Fill listbox and set selection (is assumed there is always a selection)...
PostMessage(hDlg, WM_COMMAND, ID_INIT, 0L); return (TRUE);
case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam);
switch (wmId) { case IDOK: DlgFileOptions_Save(hDlg); FileOptionsDefaultsSet(FileOptions); EndDialog(hDlg, 0); return (TRUE);
case IDCANCEL: EndDialog(hDlg, 0); return (TRUE);
case IDHELP: WinHelp(hDlg, HELP_FILE, HELP_CONTEXT, (DWORD) IDC_HELP_FILE); return (TRUE);
case IDC_CHKFILES: hCtrl = GetDlgItem(hDlg, IDC_CHKFILES); if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == 1) FileDialogToggle(hDlg, TRUE); else FileDialogToggle(hDlg, FALSE);
return (TRUE);
case IDC_ADD: SelectType = SELECT_TYPE_ADD; CurrentShare = NULL; NWShareSelect_Do(hDlg);
if (CurrentShare != NULL) { DlgFileOptions_ListboxAdd(hDlg, CurrentShare, &wItemNum, FALSE );
// Check if Add button needs to be disabled
ShareList->ConvertCount++; if (ShareList->Count == ShareList->ConvertCount) { hCtrl = GetDlgItem(hDlg, IDC_ADD); EnableWindow(hCtrl, FALSE); }
// Buttons need to be re-enabled
FileOptionsToggleControls(hDlg, TRUE);
// Now make sure focus is set
hCtrl = GetDlgItem(hDlg, IDC_LIST1); ColumnLB_SetCurSel(hCtrl, wItemNum); wItemNum = ColumnLB_GetCurSel(hCtrl); if (wItemNum == LB_ERR) ColumnLB_SetCurSel(hCtrl, 0);
};
return (TRUE);
case IDC_DELETE: hCtrl = GetDlgItem(hDlg, IDC_LIST1); wItemNum = ColumnLB_GetCurSel(hCtrl); if (wItemNum != LB_ERR) { dwData = ColumnLB_GetItemData(hCtrl, wItemNum); pShare = (SHARE_BUFFER *)dwData; pShare->Convert = FALSE; ShareList->ConvertCount--;
// Now need to delete dest share, or reduce use count
if (pShare->DestShare != NULL) if (pShare->Virtual) { VShare = (VIRTUAL_SHARE_BUFFER *) pShare->DestShare; VShareListDelete(DServ, VShare); pShare->DestShare = NULL; }
ColumnLB_DeleteString(hCtrl, wItemNum); }
if (!ShareList->ConvertCount) FileOptionsToggleControls(hDlg, FALSE); else { wItemNum = ColumnLB_GetCurSel(hCtrl); if (wItemNum == LB_ERR) ColumnLB_SetCurSel(hCtrl, 0); }
if (ShareList->Count != ShareList->ConvertCount) { hCtrl = GetDlgItem(hDlg, IDC_ADD); EnableWindow(hCtrl, TRUE); }
return (TRUE);
case IDC_MODIFY: SelectType = SELECT_TYPE_MODIFY; hCtrl = GetDlgItem(hDlg, IDC_LIST1); wItemNum = ColumnLB_GetCurSel(hCtrl); if (wItemNum != LB_ERR) { dwData = ColumnLB_GetItemData(hCtrl, wItemNum); CurrentShare = (SHARE_BUFFER *)dwData; NWShareSelect_Do(hDlg);
// Now update listbox to reflect any changes
ColumnLB_DeleteString(hCtrl, wItemNum);
DlgFileOptions_ListboxAdd(hDlg, CurrentShare, &wItemNum, TRUE );
// now reset focus back to this item
ColumnLB_SetCurSel(hCtrl, wItemNum); } return (TRUE);
case IDC_FILES: hCtrl = GetDlgItem(hDlg, IDC_LIST1); wItemNum = ColumnLB_GetCurSel(hCtrl); if (wItemNum != LB_ERR) { dwData = ColumnLB_GetItemData(hCtrl, wItemNum); CurrentShare = (SHARE_BUFFER *)dwData; FileSelect_Do(hDlg, SServ, CurrentShare); } return (TRUE);
case IDC_FOPTIONS: return (TRUE);
case ID_INIT:
if (ShareList != NULL) { SList = ShareList->SList;
for (i = 0; i < ShareList->Count; i++) if (SList[i].Convert) { DlgFileOptions_ListboxAdd(hDlg, &SList[i], &wItemNum, FALSE ); hCtrl = GetDlgItem(hDlg, IDC_LIST1); ColumnLB_SetCurSel(hCtrl, 0); }
if (ShareList->Count == ShareList->ConvertCount) { hCtrl = GetDlgItem(hDlg, IDC_ADD); EnableWindow(hCtrl, FALSE); }
if (!ShareList->ConvertCount) FileOptionsToggleControls(hDlg, FALSE);
} else FileOptionsToggleControls(hDlg, FALSE);
return (TRUE);
case IDC_LIST1: switch (wmEvent) { case LBN_DBLCLK: PostMessage(hDlg, WM_COMMAND, IDC_MODIFY, 0L); break;
case LBN_SELCHANGE: if (!ShareList || !ShareList->ConvertCount) FileOptionsToggleControls(hDlg, TRUE);
break;
} break;
} break; }
return (FALSE); // Didn't process the message
lParam; } // DlgFileOptions
/*+-------------------------------------------------------------------------+
| FileOptions_Do() | +-------------------------------------------------------------------------+*/ void FileOptions_Do(HWND hDlg, void *ConvOptions, SOURCE_SERVER_BUFFER *SourceServer, DEST_SERVER_BUFFER *DestServer) { DLGPROC lpfnDlg;
SServ = SourceServer; DServ = DestServer;
NWServerFree(); NWServerSet(SourceServer->Name); NTServerSet(DestServer->Name); FileOptions = (FILE_OPTIONS *) ConvOptions; ShareList = SServ->ShareList;
lpfnDlg = MakeProcInstance((DLGPROC)DlgFileOptions, hInst); DialogBox(hInst, TEXT("FileMain"), hDlg, lpfnDlg) ;
FreeProcInstance(lpfnDlg); } // FileOptions_Do
|