1075 lines
35 KiB
C
1075 lines
35 KiB
C
/*
|
|
+-------------------------------------------------------------------------+
|
|
| 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
|