1156 lines
34 KiB
C
1156 lines
34 KiB
C
/*
|
|
+-------------------------------------------------------------------------+
|
|
| Server Browsing Dialog Routines |
|
|
+-------------------------------------------------------------------------+
|
|
| (c) Copyright 1993-1994 |
|
|
| Microsoft Corp. |
|
|
| All rights reserved |
|
|
| |
|
|
| Program : [sbrowse.c] |
|
|
| Programmer : Arthur Hanson |
|
|
| Original Program Date : [Dec 01, 1993] |
|
|
| Last Update : [Jun 16, 1994] |
|
|
| |
|
|
| Version: 1.00 |
|
|
| |
|
|
| Description: |
|
|
| |
|
|
| History: |
|
|
| arth Jun 16, 1994 1.00 Original Version. |
|
|
| |
|
|
+-------------------------------------------------------------------------+
|
|
*/
|
|
|
|
#include "globals.h"
|
|
|
|
#include <math.h>
|
|
|
|
#include "nwconv.h"
|
|
#include "hierdraw.h"
|
|
#include "convapi.h"
|
|
#include "ntnetapi.h"
|
|
#include "nwnetapi.h"
|
|
|
|
#define SERVER_TYPE_NT 0
|
|
#define SERVER_TYPE_NW 1
|
|
|
|
extern BOOL IsNetWareBrowse;
|
|
static int BrowseType;
|
|
|
|
|
|
TCHAR NetProvider[30];
|
|
|
|
|
|
// Internal defines
|
|
VOID DlgServSel_OnDrawItem(HWND hwnd, DRAWITEMSTRUCT FAR* lpDrawItem);
|
|
BOOL DlgServSel_OnCommand(HWND hDlg, WPARAM wParam, LPARAM lParam);
|
|
VOID DlgServSel_ActionItem(HWND hWndList, DWORD_PTR dwData, WORD wItemNum);
|
|
LRESULT CALLBACK DlgServSel(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
|
|
BOOL EnumServs(HWND hDlg);
|
|
|
|
|
|
#define ROWS 2
|
|
#define COLS 3
|
|
|
|
HEIRDRAWSTRUCT HierDrawStruct;
|
|
|
|
static HWND hEdit;
|
|
static HWND hParent;
|
|
static SERVER_BROWSE_LIST *ServList = NULL;
|
|
static TCHAR SourceServer[256];
|
|
static TCHAR DestServer[256];
|
|
static DEST_SERVER_BUFFER *DServ = NULL;
|
|
static SOURCE_SERVER_BUFFER *SServ = NULL;
|
|
BOOL DlgOk;
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| BrowseListCompare()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
int __cdecl BrowseListCompare(const void *arg1, const void *arg2) {
|
|
SERVER_BROWSE_BUFFER *SLarg1, *SLarg2;
|
|
|
|
SLarg1 = (SERVER_BROWSE_BUFFER *) arg1;
|
|
SLarg2 = (SERVER_BROWSE_BUFFER *) arg2;
|
|
|
|
// This works as the first item of the structure is the string
|
|
return lstrcmpi( SLarg1->Name, SLarg2->Name);
|
|
|
|
} // BrowseListCompare
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| BrowseListInit()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void BrowseListInit(HWND hDlg, int ServerType) {
|
|
SERVER_BROWSE_BUFFER *SList;
|
|
DWORD Status;
|
|
DWORD Count;
|
|
DWORD Index;
|
|
DWORD i;
|
|
HWND hCtrl;
|
|
|
|
switch (BrowseType) {
|
|
case BROWSE_TYPE_NT:
|
|
Status = NTServerEnum(NULL, &ServList);
|
|
break;
|
|
|
|
case BROWSE_TYPE_NW:
|
|
Status = NWServerEnum(NULL, &ServList);
|
|
break;
|
|
}
|
|
|
|
if (ServList) {
|
|
Count = ServList->Count;
|
|
SList = ServList->SList;
|
|
|
|
// Sort the server list before putting it in the dialog
|
|
qsort((void *) SList, (size_t) Count, sizeof(SERVER_BROWSE_BUFFER), BrowseListCompare);
|
|
|
|
hCtrl = GetDlgItem(hDlg, IDC_LIST1);
|
|
for (i = 0; i < Count; i++) {
|
|
Index = i;
|
|
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) Index);
|
|
}
|
|
|
|
}
|
|
|
|
} // BrowseListInit
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| BrowseListFree()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void BrowseListFree(SERVER_BROWSE_LIST *ServList) {
|
|
DWORD i;
|
|
DWORD Count;
|
|
SERVER_BROWSE_BUFFER *SList;
|
|
|
|
if (!ServList)
|
|
return;
|
|
|
|
SList = ServList->SList;
|
|
Count = ServList->Count;
|
|
for (i = 0; i < Count; i++)
|
|
if (SList[i].child)
|
|
FreeMemory((LPBYTE) SList[i].child);
|
|
|
|
FreeMemory((LPBYTE) ServList);
|
|
ServList = NULL;
|
|
|
|
} // BrowseListFree
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| DlgServSel_Do()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
int DlgServSel_Do(int BType, HWND hwndOwner) {
|
|
int result;
|
|
DLGPROC lpfndp;
|
|
|
|
BrowseType = BType;
|
|
|
|
// Init the Hier Draw stuff - Need to do this here so we have a value
|
|
// for WM_MEASUREITEM which is sent before the WM_INITDIALOG message
|
|
HierDraw_DrawInit(hInst, IDR_LISTICONS, ROWS, COLS, FALSE, &HierDrawStruct, TRUE );
|
|
|
|
lpfndp = (DLGPROC)MakeProcInstance((FARPROC)DlgServSel, hInst);
|
|
result = (int) DialogBox(hInst, TEXT("DlgServSel"), hwndOwner, lpfndp) ;
|
|
|
|
FreeProcInstance((FARPROC)lpfndp);
|
|
HierDraw_DrawTerm(&HierDrawStruct);
|
|
|
|
return result;
|
|
} // DlgServSel_Do
|
|
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| BrowseListFind()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
SERVER_BROWSE_BUFFER *BrowseListFind(DWORD_PTR dwData) {
|
|
DWORD ContainerNum;
|
|
DWORD Index = 0;
|
|
SERVER_BROWSE_LIST *ServerSubList;
|
|
|
|
Index = LOWORD(dwData);
|
|
ContainerNum = HIWORD(dwData);
|
|
|
|
if (!ContainerNum)
|
|
return(&ServList->SList[Index]);
|
|
else {
|
|
ContainerNum--; // Adjust for 0 index
|
|
ServerSubList = (SERVER_BROWSE_LIST *) ServList->SList[ContainerNum].child;
|
|
return(&ServerSubList->SList[Index]);
|
|
}
|
|
|
|
} // BrowseListFind
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| DlgServSel_OnDrawItem()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
VOID DlgServSel_OnDrawItem(HWND hwnd, DRAWITEMSTRUCT FAR* lpDrawItem) {
|
|
TCHAR szText[MAX_PATH + 1];
|
|
DWORD_PTR dwData;
|
|
int nLevel = 0;
|
|
int nRow = 0;
|
|
int nColumn = 0;
|
|
DWORD dwConnectLevel = 0;
|
|
SERVER_BROWSE_BUFFER *SList;
|
|
|
|
// if there is nothing to browse then don't need to draw anything.
|
|
if (ServList == NULL)
|
|
return;
|
|
|
|
dwData = lpDrawItem->itemData;
|
|
|
|
SList = BrowseListFind(dwData);
|
|
|
|
// if there is a double back-slash then trim it off...
|
|
if ((SList->Name[0] == TEXT('\\')) && (SList->Name[1] == TEXT('\\')))
|
|
lstrcpy(szText, &(SList->Name[2]));
|
|
else
|
|
lstrcpy(szText, SList->Name);
|
|
|
|
// Select the correct icon, open folder, closed folder, or document.
|
|
switch(BrowseType) {
|
|
case BROWSE_TYPE_NT:
|
|
break;
|
|
|
|
case BROWSE_TYPE_NW:
|
|
nRow = 1;
|
|
break;
|
|
|
|
}
|
|
|
|
// Can this item be opened ?
|
|
if (SList->Container) {
|
|
|
|
// Is it open ?
|
|
if ( HierDraw_IsOpened(&HierDrawStruct, dwData) )
|
|
nColumn = 1;
|
|
else
|
|
nColumn = 0;
|
|
}
|
|
else {
|
|
if (!IsNetWareBrowse)
|
|
nLevel = 1;
|
|
|
|
nColumn = 2;
|
|
}
|
|
|
|
// All set to call drawing function.
|
|
HierDraw_OnDrawItem(hwnd, lpDrawItem, nLevel, dwConnectLevel, szText, nRow, nColumn, &HierDrawStruct);
|
|
|
|
return;
|
|
|
|
} // DlgServSel_OnDrawItem
|
|
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| DlgServSel_OnCommand()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
BOOL DlgServSel_OnCommand(HWND hDlg, WPARAM wParam, LPARAM lParam) {
|
|
int wmId, wmEvent;
|
|
WORD wItemNum;
|
|
DWORD_PTR dwData;
|
|
HWND hCtrl;
|
|
TCHAR ServerName[MAX_NW_OBJECT_NAME_LEN + 1];
|
|
HWND hParent;
|
|
SERVER_BROWSE_BUFFER *SList;
|
|
|
|
wmId = LOWORD(wParam);
|
|
wmEvent = HIWORD(wParam);
|
|
|
|
switch (wmId) {
|
|
case IDOK:
|
|
hCtrl = GetDlgItem(hDlg, IDC_LIST1);
|
|
|
|
wItemNum = (WORD) SendMessage(hCtrl, LB_GETCURSEL, 0, 0L);
|
|
|
|
if (wItemNum != (WORD) LB_ERR) {
|
|
dwData = (DWORD) SendMessage(hCtrl, LB_GETITEMDATA, wItemNum, 0L);
|
|
|
|
if (dwData != LB_ERR)
|
|
DlgServSel_ActionItem(hCtrl, dwData, (WORD) wItemNum);
|
|
}
|
|
break;
|
|
|
|
case IDC_ALTOK:
|
|
hCtrl = GetDlgItem(hDlg, IDC_EDIT1);
|
|
* (WORD *)ServerName = sizeof(ServerName);
|
|
SendMessage(hCtrl, EM_GETLINE, 0, (LPARAM) ServerName);
|
|
|
|
CanonServerName((LPTSTR) ServerName);
|
|
|
|
hParent = GetWindow (hDlg, GW_OWNER);
|
|
|
|
if (IsNetWareBrowse)
|
|
hCtrl = GetDlgItem(hParent, IDC_EDITNWSERV);
|
|
else
|
|
hCtrl = GetDlgItem(hParent, IDC_EDITNTSERV);
|
|
|
|
SendMessage(hCtrl, WM_SETTEXT, (WPARAM) 0, (LPARAM) ServerName);
|
|
EndDialog(hDlg, 0);
|
|
break;
|
|
|
|
case ID_INIT:
|
|
SetFocus(GetDlgItem(hDlg, IDC_EDIT1));
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, 0);
|
|
break;
|
|
|
|
case IDHELP:
|
|
switch (BrowseType) {
|
|
case BROWSE_TYPE_NT:
|
|
WinHelp(hDlg, HELP_FILE, HELP_CONTEXT, (DWORD) IDC_HELP_BROWSENT);
|
|
break;
|
|
|
|
case BROWSE_TYPE_NW:
|
|
WinHelp(hDlg, HELP_FILE, HELP_CONTEXT, (DWORD) IDC_HELP_BROWSENW);
|
|
break;
|
|
|
|
}
|
|
break;
|
|
|
|
case IDC_CHKUSERS:
|
|
break;
|
|
|
|
case IDC_LOADNWSERV:
|
|
BrowseListInit(hDlg, SERVER_TYPE_NW);
|
|
break;
|
|
|
|
case IDC_LOADNTSERV:
|
|
BrowseListInit(hDlg, SERVER_TYPE_NT);
|
|
break;
|
|
|
|
case IDC_LOADDOMAIN:
|
|
BrowseListInit(hDlg, SERVER_TYPE_NT);
|
|
break;
|
|
|
|
case ID_SETSEL:
|
|
hCtrl = GetDlgItem(hDlg, IDC_LIST1);
|
|
wItemNum = (WORD) SendMessage(hCtrl, LB_GETCURSEL, 0, 0L);
|
|
|
|
if (wItemNum != (WORD) LB_ERR) {
|
|
dwData = (DWORD) SendMessage(hCtrl, LB_GETITEMDATA, wItemNum, 0L);
|
|
|
|
if (dwData != LB_ERR) {
|
|
SList = BrowseListFind(dwData);
|
|
|
|
// Is this an item or folder
|
|
if (!SList->Container) {
|
|
// is a server - so put it up in edit box
|
|
if (SList->Name[0] == TEXT('\\') && SList->Name[1] == TEXT('\\'))
|
|
SendMessage(hEdit, WM_SETTEXT, (WPARAM) 0, (LPARAM) &SList->Name[2]);
|
|
else
|
|
SendMessage(hEdit, WM_SETTEXT, (WPARAM) 0, (LPARAM) SList->Name);
|
|
|
|
hCtrl = GetDlgItem(hDlg, IDC_ALTOK);
|
|
EnableWindow(hCtrl, TRUE);
|
|
} else {
|
|
SendMessage(hEdit, WM_SETTEXT, (WPARAM) 0, (LPARAM) TEXT(""));
|
|
hCtrl = GetDlgItem(hDlg, IDC_ALTOK);
|
|
EnableWindow(hCtrl, FALSE);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_LIST1:
|
|
|
|
switch (wmEvent) {
|
|
case LBN_DBLCLK:
|
|
hCtrl = GetDlgItem(hDlg, IDC_LIST1);
|
|
wItemNum = (WORD) SendMessage(hCtrl, LB_GETCURSEL, 0, 0L);
|
|
|
|
if (wItemNum != (WORD) LB_ERR) {
|
|
dwData = (DWORD) SendMessage(hCtrl, LB_GETITEMDATA, wItemNum, 0L);
|
|
|
|
if (dwData != LB_ERR)
|
|
DlgServSel_ActionItem(hCtrl, dwData, wItemNum);
|
|
}
|
|
break;
|
|
|
|
case LBN_SELCHANGE:
|
|
PostMessage(hDlg, WM_COMMAND, (WPARAM) ID_SETSEL, 0L);
|
|
break;
|
|
|
|
}
|
|
break;
|
|
|
|
case IDC_EDIT1:
|
|
|
|
if (wmEvent == EN_CHANGE) {
|
|
hCtrl = GetDlgItem(hDlg, IDC_EDIT1);
|
|
|
|
if (SendMessage(hCtrl, EM_LINELENGTH, 0, 0)) {
|
|
hCtrl = GetDlgItem(hDlg, IDC_ALTOK);
|
|
EnableWindow(hCtrl, TRUE);
|
|
} else {
|
|
hCtrl = GetDlgItem(hDlg, IDC_ALTOK);
|
|
EnableWindow(hCtrl, FALSE);
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
} // DlgServSel_OnCommand
|
|
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| DlgServSel_ActionItem()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
VOID DlgServSel_ActionItem(HWND hWndList, DWORD_PTR dwData, WORD wItemNum) {
|
|
DWORD_PTR dwIncr;
|
|
DWORD Parent;
|
|
DWORD Status;
|
|
DWORD Count;
|
|
SERVER_BROWSE_BUFFER *SList;
|
|
SERVER_BROWSE_LIST *SubList;
|
|
DWORD wItem, wCount, dwAddItem;
|
|
|
|
if (dwData == LB_ERR)
|
|
return;
|
|
|
|
SList = BrowseListFind(dwData);
|
|
|
|
// Is this an item or folder
|
|
if (!SList->Container) {
|
|
// is a server - so put it up in edit box
|
|
if (SList->Name[0] == TEXT('\\') && SList->Name[1] == TEXT('\\'))
|
|
SendMessage(hEdit, WM_SETTEXT, (WPARAM) 0, (LPARAM) &SList->Name[2]);
|
|
else
|
|
SendMessage(hEdit, WM_SETTEXT, (WPARAM) 0, (LPARAM) SList->Name);
|
|
|
|
PostMessage(hParent, WM_COMMAND, (WPARAM) IDC_ALTOK, (LPARAM) 0);
|
|
|
|
}
|
|
else {
|
|
SendMessage(hEdit, WM_SETTEXT, (WPARAM) 0, (LPARAM) TEXT(""));
|
|
|
|
// Is it open ?
|
|
if ( HierDraw_IsOpened(&HierDrawStruct, dwData) ) {
|
|
|
|
// It's open ... Close it
|
|
HierDraw_CloseItem(&HierDrawStruct, dwData);
|
|
|
|
// Remove the child items. Close any children that are
|
|
// open on the way.
|
|
|
|
// wItem can stay constant as we are moveing stuff up in the listbox as we
|
|
// are deleting.
|
|
wItemNum++;
|
|
dwIncr = SendMessage(hWndList, LB_GETITEMDATA, wItemNum, 0L);
|
|
SList = BrowseListFind(dwIncr);
|
|
|
|
while (!SList->Container) {
|
|
SendMessage(hWndList, LB_DELETESTRING, wItemNum, 0L);
|
|
dwIncr = SendMessage(hWndList, LB_GETITEMDATA, wItemNum, 0L);
|
|
SList = BrowseListFind(dwIncr);
|
|
}
|
|
|
|
Parent = HIWORD(dwIncr);
|
|
if (Parent) {
|
|
Parent--;
|
|
SList = BrowseListFind(Parent);
|
|
FreeMemory((LPBYTE) SList->child);
|
|
SList->child = NULL;
|
|
}
|
|
|
|
}
|
|
else {
|
|
|
|
// It's closed ... Open it
|
|
HierDraw_OpenItem(&HierDrawStruct, dwData);
|
|
|
|
SendMessage(hWndList, WM_SETREDRAW, FALSE, 0L); // Disable redrawing.
|
|
|
|
CursorHourGlass();
|
|
|
|
// Enumerate the servers in this container (domain)
|
|
Status = NTServerEnum(SList->Name, (SERVER_BROWSE_LIST **) &SList->child);
|
|
|
|
if (!Status) {
|
|
Parent = LOWORD(dwData);
|
|
SubList = (SERVER_BROWSE_LIST *) SList->child;
|
|
Count = SubList->Count;
|
|
SList = SubList->SList;
|
|
|
|
// Sort the server list before putting it in the dialog
|
|
qsort((void *) SList, (size_t) Count, sizeof(SERVER_BROWSE_BUFFER), BrowseListCompare);
|
|
|
|
for (wItem = wItemNum, wCount = 0, wItem++;
|
|
wCount < SubList->Count; wItem++, wCount++) {
|
|
dwAddItem = ((Parent + 1) << 16) + wCount;
|
|
SendMessage(hWndList, LB_INSERTSTRING, wItem, dwAddItem);
|
|
}
|
|
|
|
}
|
|
|
|
// Make sure as many child items as possible are showing
|
|
HierDraw_ShowKids(&HierDrawStruct, hWndList, (WORD) wItemNum, (WORD) SubList->Count );
|
|
|
|
CursorNormal();
|
|
|
|
SendMessage(hWndList, WM_SETREDRAW, TRUE, 0L); // Enable redrawing.
|
|
InvalidateRect(hWndList, NULL, TRUE); // Force redraw
|
|
}
|
|
}
|
|
|
|
} // DlgServSel_ActionItem
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ServerListScan()
|
|
|
|
|
| Given a key, scans the list of servers to find a matching first
|
|
| letter in the server name.
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
WORD ServerListScan(HWND hWnd, DWORD dwData, TCHAR Key) {
|
|
BOOL Found = FALSE;
|
|
WORD wItemNum;
|
|
DWORD dwFindItem;
|
|
DWORD dwData2;
|
|
DWORD ContainerNum;
|
|
WORD Index = 0;
|
|
DWORD Count = 0;
|
|
SERVER_BROWSE_LIST *ptrServList;
|
|
SERVER_BROWSE_BUFFER *SList;
|
|
|
|
Index = LOWORD(dwData);
|
|
ContainerNum = HIWORD(dwData);
|
|
|
|
// Get the head of the Server list for the current item
|
|
if (!ContainerNum)
|
|
ptrServList = ServList;
|
|
else {
|
|
ptrServList = (SERVER_BROWSE_LIST *) ServList->SList[ContainerNum-1].child;
|
|
}
|
|
|
|
// Now iterate down through the list trying to find the key...
|
|
SList = ptrServList->SList;
|
|
while ((!Found) && (Count < ptrServList->Count)) {
|
|
if (SList[Count].Name[0] == Key) {
|
|
dwFindItem = Count;
|
|
Found = TRUE;
|
|
} else
|
|
Count++;
|
|
}
|
|
|
|
// If we found the key now have to find the appropriate index value
|
|
if (Found && (Index != Count)) {
|
|
// Fix up the new item data to find
|
|
if (ContainerNum)
|
|
dwFindItem += (ContainerNum << 16);
|
|
|
|
wItemNum = (WORD) SendMessage(hWnd, LB_GETCURSEL, 0, 0L);
|
|
Found = FALSE;
|
|
if (Index < Count) {
|
|
// search forward in list
|
|
dwData2 = 0;
|
|
while ((dwData2 != LB_ERR) && !Found) {
|
|
dwData2 = (DWORD) SendMessage(hWnd, LB_GETITEMDATA, wItemNum, 0L);
|
|
|
|
if (dwData2 == dwFindItem)
|
|
Found = TRUE;
|
|
else
|
|
wItemNum++;
|
|
|
|
}
|
|
} else {
|
|
// search backwards in list
|
|
Count = Index;
|
|
while ((wItemNum > 0) && !Found) {
|
|
wItemNum--;
|
|
dwData2 = (DWORD) SendMessage(hWnd, LB_GETITEMDATA, wItemNum, 0L);
|
|
Count--;
|
|
|
|
if (dwData2 == dwFindItem)
|
|
Found = TRUE;
|
|
}
|
|
}
|
|
} else
|
|
return (Index);
|
|
|
|
if (Found)
|
|
return(wItemNum);
|
|
else
|
|
return (Index);
|
|
|
|
} // ServerListScan
|
|
|
|
|
|
|
|
static WNDPROC _wpOrigWndProc;
|
|
#define LISTBOX_COUNT 13
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ListSubClassProc()
|
|
|
|
|
| Handles key processing for the hierarchical listbox. Specifically
|
|
| the up/down arrow keys and the letter keys.
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
LRESULT CALLBACK ListSubClassProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
|
LRESULT lResult = 0;
|
|
BOOL fCallOrigProc = TRUE;
|
|
DWORD wItemNum;
|
|
DWORD wNewNum;
|
|
DWORD dwData;
|
|
|
|
switch (message) {
|
|
|
|
case WM_KEYDOWN:
|
|
wItemNum = (DWORD) SendMessage(hWnd, LB_GETCURSEL, 0, 0L);
|
|
if (wItemNum != (DWORD) LB_ERR)
|
|
dwData = (DWORD) SendMessage(hWnd, LB_GETITEMDATA, (WPARAM) wItemNum, 0L);
|
|
else {
|
|
wItemNum = 0;
|
|
SendMessage(hWnd, LB_SETCURSEL, (WPARAM) 0, 0L);
|
|
dwData = (DWORD) SendMessage(hWnd, LB_GETITEMDATA, (WPARAM) wItemNum, 0L);
|
|
|
|
if ((dwData == LB_ERR) || (dwData == LB_ERR))
|
|
break;
|
|
}
|
|
|
|
fCallOrigProc = FALSE;
|
|
|
|
switch (LOWORD(wParam)) {
|
|
|
|
case VK_PRIOR:
|
|
if (wItemNum > LISTBOX_COUNT)
|
|
wNewNum = wItemNum - LISTBOX_COUNT;
|
|
else
|
|
wNewNum = 0;
|
|
|
|
PostMessage(hWnd, LB_SETCURSEL, (WPARAM) wNewNum, 0L);
|
|
PostMessage(hParent, WM_COMMAND, (WPARAM) ID_SETSEL, 0L);
|
|
break;
|
|
|
|
case VK_NEXT:
|
|
wItemNum = wItemNum + LISTBOX_COUNT;
|
|
wNewNum = (WORD) SendMessage(hWnd, LB_GETCOUNT, (WPARAM) 0, 0L);
|
|
|
|
if (wItemNum < wNewNum)
|
|
PostMessage(hWnd, LB_SETCURSEL, (WPARAM) wItemNum, 0L);
|
|
else
|
|
PostMessage(hWnd, LB_SETCURSEL, (WPARAM) (wNewNum - 1), 0L);
|
|
|
|
PostMessage(hParent, WM_COMMAND, (WPARAM) ID_SETSEL, 0L);
|
|
break;
|
|
|
|
case VK_END:
|
|
wItemNum = (WORD) SendMessage(hWnd, LB_GETCOUNT, (WPARAM) 0, 0L);
|
|
|
|
if (wItemNum != LB_ERR)
|
|
PostMessage(hWnd, LB_SETCURSEL, (WPARAM) (wItemNum - 1), 0L);
|
|
|
|
PostMessage(hParent, WM_COMMAND, (WPARAM) ID_SETSEL, 0L);
|
|
break;
|
|
|
|
case VK_HOME:
|
|
PostMessage(hWnd, LB_SETCURSEL, (WPARAM) 0, 0L);
|
|
PostMessage(hParent, WM_COMMAND, (WPARAM) ID_SETSEL, 0L);
|
|
break;
|
|
|
|
case VK_UP:
|
|
if (wItemNum > 0) {
|
|
wItemNum--;
|
|
PostMessage(hWnd, LB_SETCURSEL, (WPARAM) wItemNum, 0L);
|
|
}
|
|
PostMessage(hParent, WM_COMMAND, (WPARAM) ID_SETSEL, 0L);
|
|
break;
|
|
|
|
case VK_DOWN:
|
|
wItemNum++;
|
|
PostMessage(hWnd, LB_SETCURSEL, (WPARAM) wItemNum, 0L);
|
|
PostMessage(hParent, WM_COMMAND, (WPARAM) ID_SETSEL, 0L);
|
|
break;
|
|
|
|
case VK_F1:
|
|
fCallOrigProc = TRUE;
|
|
break;
|
|
|
|
default:
|
|
wItemNum = ServerListScan(hWnd, dwData, (TCHAR) wParam);
|
|
PostMessage(hWnd, LB_SETCURSEL, (WPARAM) wItemNum, 0L);
|
|
PostMessage(hParent, WM_COMMAND, (WPARAM) ID_SETSEL, 0L);
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (fCallOrigProc)
|
|
lResult = CallWindowProc(_wpOrigWndProc, hWnd, message, wParam, lParam);
|
|
|
|
return (lResult);
|
|
|
|
} // ListSubClassProc
|
|
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| DlgServSel()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
LRESULT CALLBACK DlgServSel(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
|
|
HWND hCtrl;
|
|
|
|
switch (message) {
|
|
|
|
case WM_INITDIALOG:
|
|
// Center the dialog over the application window
|
|
CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));
|
|
hParent = hDlg;
|
|
|
|
// Disable the Add button until server is selected
|
|
hCtrl = GetDlgItem(hDlg, IDC_ALTOK);
|
|
EnableWindow(hCtrl, FALSE);
|
|
|
|
// subclass listbox handler
|
|
hCtrl = GetDlgItem(hDlg, IDC_LIST1);
|
|
_wpOrigWndProc = SubclassWindow(hCtrl, ListSubClassProc);
|
|
|
|
switch (BrowseType) {
|
|
case BROWSE_TYPE_NT:
|
|
PostMessage(hDlg, WM_COMMAND, IDC_LOADNTSERV, 0);
|
|
lstrcpy( NetProvider, NT_PROVIDER);
|
|
hCtrl = GetDlgItem(hDlg, IDC_EDIT1);
|
|
PostMessage(hCtrl, EM_LIMITTEXT, (WPARAM) MAX_NT_SERVER_NAME_LEN, 0);
|
|
break;
|
|
|
|
case BROWSE_TYPE_NW:
|
|
lstrcpy( NetProvider, NW_PROVIDER);
|
|
SetWindowText(hDlg, Lids(IDS_S_35));
|
|
PostMessage(hDlg, WM_COMMAND, IDC_LOADNWSERV, 0);
|
|
hCtrl = GetDlgItem(hDlg, IDC_EDIT1);
|
|
PostMessage(hCtrl, EM_LIMITTEXT, (WPARAM) MAX_NW_OBJECT_NAME_LEN, 0);
|
|
break;
|
|
|
|
}
|
|
|
|
hEdit = GetDlgItem(hDlg, IDC_EDIT1);
|
|
PostMessage(hDlg, WM_COMMAND, ID_INIT, 0);
|
|
return (TRUE);
|
|
|
|
case WM_DESTROY:
|
|
BrowseListFree(ServList);
|
|
break;
|
|
|
|
case WM_SETFONT:
|
|
// Set the text height
|
|
HierDraw_DrawSetTextHeight(GetDlgItem(hDlg, IDC_LIST1), (HFONT)wParam, &HierDrawStruct);
|
|
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
return DlgServSel_OnCommand(hDlg, wParam, lParam);
|
|
|
|
case WM_DRAWITEM:
|
|
DlgServSel_OnDrawItem(hDlg, (DRAWITEMSTRUCT FAR*)(lParam));
|
|
return TRUE;
|
|
break;
|
|
|
|
case WM_MEASUREITEM:
|
|
HierDraw_OnMeasureItem(hDlg, (MEASUREITEMSTRUCT FAR*)(lParam), &HierDrawStruct);
|
|
return TRUE;
|
|
break;
|
|
|
|
}
|
|
|
|
return (FALSE);
|
|
|
|
lParam;
|
|
|
|
} // DlgServSel
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| DlgGetServ_OnInitDialog()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
BOOL DlgGetServ_OnInitDialog(HWND hDlg, HWND hwndFocus, LPARAM lParam) {
|
|
HWND hCtrl;
|
|
|
|
// Center the dialog over the application window
|
|
CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));
|
|
|
|
// Disable the Add button until both servers are selected
|
|
hCtrl = GetDlgItem(hDlg, IDOK);
|
|
EnableWindow(hCtrl, FALSE);
|
|
|
|
hCtrl = GetDlgItem(hDlg, IDC_EDITNWSERV);
|
|
PostMessage(hCtrl, EM_LIMITTEXT, (WPARAM) MAX_NW_OBJECT_NAME_LEN, 0);
|
|
hCtrl = GetDlgItem(hDlg, IDC_EDITNTSERV);
|
|
PostMessage(hCtrl, EM_LIMITTEXT, (WPARAM) MAX_NT_SERVER_NAME_LEN, 0);
|
|
PostMessage(hDlg, WM_COMMAND, ID_INIT, 0);
|
|
return (TRUE);
|
|
|
|
} // DlgGetServ_OnInitDialog
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| MapShare()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
// CODEWORK: This routine can be condensed - all the virtual add share stuff
|
|
// can be compacted to a subroutine
|
|
BOOL MapShare(SHARE_BUFFER *Share, DEST_SERVER_BUFFER *DServ) {
|
|
static TCHAR Path[MAX_PATH + 1];
|
|
SHARE_LIST *ShareList;
|
|
SHARE_BUFFER *SList;
|
|
SHARE_BUFFER *MatchShare;
|
|
VIRTUAL_SHARE_BUFFER *VShare;
|
|
DRIVE_BUFFER *DList;
|
|
DRIVE_BUFFER *MaxNTFS = NULL;
|
|
DRIVE_BUFFER *MaxFAT = NULL;
|
|
BOOL Match = FALSE;
|
|
BOOL NTFS = FALSE;
|
|
BOOL Virtual = FALSE;
|
|
DWORD i;
|
|
|
|
// First see if there is a 1:1 share correspondence already in existance
|
|
|
|
// the normal shares first...
|
|
ShareList = DServ->ShareList;
|
|
SList = ShareList->SList;
|
|
|
|
if (ShareList != NULL)
|
|
for (i = 0; ((i < ShareList->Count) && (!Match)); i++) {
|
|
if (!lstrcmpi(SList[i].Name, Share->Name)) {
|
|
MatchShare = &SList[i];
|
|
Match = TRUE;
|
|
}
|
|
} // match normal share 1:1
|
|
|
|
if (!Match) {
|
|
VShare = DServ->VShareStart;
|
|
|
|
while(VShare && !Match) {
|
|
if (!lstrcmpi(VShare->Name, Share->Name)) {
|
|
// will use VShare to point to matched share
|
|
Virtual = TRUE;
|
|
Match = TRUE;
|
|
} else
|
|
VShare = VShare->next;
|
|
}
|
|
} // match VShare 1:1
|
|
|
|
if (!Match) {
|
|
// No match so make share name the same - try to find NTFS drive with
|
|
// enough room to put it on.
|
|
DList = DServ->DriveList->DList;
|
|
if (DList != NULL)
|
|
for (i = 0; ((i < DServ->DriveList->Count) && (!Match)); i++) {
|
|
if (DList[i].Type == DRIVE_TYPE_NTFS) {
|
|
// Find our Max NTFS
|
|
if (!MaxNTFS)
|
|
MaxNTFS = &DList[i];
|
|
else
|
|
if ( (MaxNTFS->FreeSpace - MaxNTFS->AllocSpace) < (DList[i].FreeSpace - DList[i].AllocSpace) )
|
|
MaxNTFS = &DList[i];
|
|
|
|
// Is an NTFS Drive - check for space
|
|
if ((DList[i].FreeSpace - DList[i].AllocSpace) > Share->Size) {
|
|
// Checks out - create a new virutal share for this
|
|
Match = TRUE;
|
|
Virtual = TRUE;
|
|
wsprintf(Path, TEXT("%s:\\%s"), DList[i].Drive, Share->Name);
|
|
VShare = VShareListAdd(DServ, Share->Name, Path);
|
|
VShare->Drive = &DList[i];
|
|
}
|
|
}
|
|
}
|
|
} // match new NTFS share
|
|
|
|
if (!Match) {
|
|
// No NTFS drive so try other drives...
|
|
DList = DServ->DriveList->DList;
|
|
if (DList != NULL)
|
|
for (i = 0; ((i < DServ->DriveList->Count) && (!Match)); i++) {
|
|
if (DList[i].Type != DRIVE_TYPE_NTFS) {
|
|
// Find our Max FAT
|
|
if (!MaxFAT)
|
|
MaxFAT = &DList[i];
|
|
else
|
|
if ( (MaxFAT->FreeSpace - MaxFAT->AllocSpace) < (DList[i].FreeSpace - DList[i].AllocSpace) )
|
|
MaxFAT = &DList[i];
|
|
|
|
// Is an other Drive - check for space
|
|
if ((DList[i].FreeSpace - DList[i].AllocSpace) > Share->Size) {
|
|
// Checks out - create a new virutal share for this
|
|
Match = TRUE;
|
|
Virtual = TRUE;
|
|
wsprintf(Path, TEXT("%s:\\%s"), DList[i].Drive, Share->Name);
|
|
VShare = VShareListAdd(DServ, Share->Name, Path);
|
|
VShare->Drive = &DList[i];
|
|
}
|
|
}
|
|
}
|
|
} // match new FAT share
|
|
|
|
if (!Match) {
|
|
// we are going to assign some virtual share for this
|
|
Virtual = TRUE;
|
|
|
|
// use max space for NTFS else FAT
|
|
if (MaxNTFS) {
|
|
// if also have some fat partitions if they have more space use them
|
|
if (!(MaxFAT && ( (MaxNTFS->FreeSpace - MaxNTFS->AllocSpace) < (MaxFAT->FreeSpace - MaxFAT->AllocSpace) ))) {
|
|
Match = TRUE;
|
|
wsprintf(Path, TEXT("%s:\\%s"), MaxNTFS->Drive, Share->Name);
|
|
VShare = VShareListAdd(DServ, Share->Name, Path);
|
|
VShare->Drive = MaxNTFS;
|
|
}
|
|
}
|
|
|
|
// if we couldn't match with NTFS then use other drive types
|
|
if (!Match) {
|
|
Match = TRUE;
|
|
wsprintf(Path, TEXT("%s:\\%s"), MaxFAT->Drive, Share->Name);
|
|
VShare = VShareListAdd(DServ, Share->Name, Path);
|
|
VShare->Drive = MaxFAT;
|
|
}
|
|
|
|
} // match anything!!!
|
|
|
|
if (Match) {
|
|
// Have the match so adjust the params
|
|
if (!Virtual) {
|
|
Share->Virtual = FALSE;
|
|
Share->DestShare = MatchShare;
|
|
|
|
// if there is no drive specified (can be the case if the share points
|
|
// to an invalid drive - like a floppy) then we skip out and ignore it
|
|
// for right now. We will alert the user when they try to do the
|
|
// transfer.
|
|
if (MatchShare->Drive == NULL)
|
|
return TRUE;
|
|
|
|
MatchShare->Drive->AllocSpace += Share->Size;
|
|
#ifdef DEBUG
|
|
dprintf(TEXT("Matched Share: %s -> %s\n"), Share->Name, MatchShare->Name);
|
|
#endif
|
|
} else {
|
|
Share->Virtual = TRUE;
|
|
Share->DestShare = (SHARE_BUFFER *) VShare;
|
|
VShare->Drive->AllocSpace += Share->Size;
|
|
VShare->UseCount++;
|
|
#ifdef DEBUG
|
|
dprintf(TEXT("Matched Virtual Share: %s -> %s\n"), Share->Name, VShare->Path);
|
|
#endif
|
|
}
|
|
|
|
return TRUE;
|
|
} else {
|
|
#ifdef DEBUG
|
|
dprintf(TEXT("Couldn't Map Share: %s\n"), Share->Name);
|
|
#endif
|
|
// Bad news - the destination server just can't handle this!
|
|
return FALSE;
|
|
}
|
|
|
|
} // MapShare
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| ShareListInit()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
void ShareListInit(SHARE_LIST *ShareList, DEST_SERVER_BUFFER *DServ) {
|
|
SHARE_BUFFER *SList;
|
|
DWORD i;
|
|
|
|
// Mark that we want to convert all the shares
|
|
if (ShareList != NULL) {
|
|
SList = ShareList->SList;
|
|
ShareList->ConvertCount = ShareList->Count;
|
|
|
|
for (i = 0; i < ShareList->Count; i++) {
|
|
if (MapShare(&SList[i], DServ))
|
|
SList[i].Convert = TRUE;
|
|
}
|
|
}
|
|
|
|
} // ShareListInit
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| DlgGetServ_OnCommand()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
BOOL DlgGetServ_OnCommand(HWND hDlg, int wmId, HWND hwndCtl, UINT wmEvent) {
|
|
HWND hCtrl;
|
|
BOOL Enable = FALSE;
|
|
|
|
switch (wmId) {
|
|
case IDOK:
|
|
hCtrl = GetDlgItem(hDlg, IDC_EDITNWSERV);
|
|
* (WORD *)SourceServer = sizeof(SourceServer);
|
|
* (WORD *)DestServer = sizeof(DestServer);
|
|
SendMessage(hCtrl, EM_GETLINE, 0, (LPARAM) SourceServer);
|
|
hCtrl = GetDlgItem(hDlg, IDC_EDITNTSERV);
|
|
SendMessage(hCtrl, EM_GETLINE, 0, (LPARAM) DestServer);
|
|
|
|
CanonServerName(SourceServer);
|
|
CanonServerName(DestServer);
|
|
|
|
if ( NWServerValidate(hDlg, SourceServer, TRUE) ) {
|
|
if ( NTServerValidate(hDlg, DestServer) ) {
|
|
// Check if we need to add server to server list
|
|
DServ = DServListFind(DestServer);
|
|
|
|
if (DServ == NULL) {
|
|
DServ = DServListAdd(DestServer);
|
|
NTServerInfoSet(hDlg, DestServer, DServ);
|
|
} else
|
|
DServ->UseCount++;
|
|
|
|
SServ = SServListFind(SourceServer);
|
|
|
|
if (SServ == NULL) {
|
|
SServ = SServListAdd(SourceServer);
|
|
NWServerInfoSet(SourceServer, SServ);
|
|
ShareListInit(SServ->ShareList, DServ);
|
|
}
|
|
|
|
DlgOk = TRUE;
|
|
EndDialog(hDlg, 0);
|
|
} else {
|
|
// Clean up connections that the Validation routines made
|
|
NWUseDel(SourceServer);
|
|
NTUseDel(DestServer);
|
|
hCtrl = GetDlgItem(hDlg, IDC_EDITNTSERV);
|
|
SetFocus(hCtrl);
|
|
}
|
|
} else {
|
|
// Clean up use validation routine made
|
|
NWUseDel(SourceServer);
|
|
hCtrl = GetDlgItem(hDlg, IDC_EDITNWSERV);
|
|
SetFocus(hCtrl);
|
|
}
|
|
|
|
return (TRUE);
|
|
|
|
case ID_INIT:
|
|
SetFocus(GetDlgItem(hDlg, IDC_EDITNWSERV));
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hDlg, 0);
|
|
DlgOk = FALSE;
|
|
return (TRUE);
|
|
break;
|
|
|
|
case IDHELP:
|
|
WinHelp(hDlg, HELP_FILE, HELP_CONTEXT, (DWORD) IDC_HELP_ADD);
|
|
return (TRUE);
|
|
break;
|
|
|
|
case IDC_NWBROWSE:
|
|
IsNetWareBrowse = TRUE;
|
|
DlgServSel_Do(BROWSE_TYPE_NW, hDlg);
|
|
return (TRUE);
|
|
break;
|
|
|
|
case IDC_NTBROWSE:
|
|
IsNetWareBrowse = FALSE;
|
|
DlgServSel_Do(BROWSE_TYPE_NT, hDlg);
|
|
return (TRUE);
|
|
break;
|
|
|
|
case IDC_EDITNWSERV:
|
|
case IDC_EDITNTSERV:
|
|
if (wmEvent == EN_CHANGE) {
|
|
hCtrl = GetDlgItem(hDlg, IDC_EDITNWSERV);
|
|
|
|
if (SendMessage(hCtrl, EM_LINELENGTH, 0, 0)) {
|
|
hCtrl = GetDlgItem(hDlg, IDC_EDITNTSERV);
|
|
if (SendMessage(hCtrl, EM_LINELENGTH, 0, 0))
|
|
Enable = TRUE;
|
|
}
|
|
|
|
hCtrl = GetDlgItem(hDlg, IDOK);
|
|
if (Enable)
|
|
EnableWindow(hCtrl, TRUE);
|
|
else
|
|
EnableWindow(hCtrl, FALSE);
|
|
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
} // DlgGetServ_OnCommand
|
|
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| DlgGetServ()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
LRESULT CALLBACK DlgGetServ(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
|
|
|
|
switch (msg) {
|
|
HANDLE_MSG(hDlg, WM_INITDIALOG, DlgGetServ_OnInitDialog);
|
|
HANDLE_MSG(hDlg, WM_COMMAND, DlgGetServ_OnCommand);
|
|
|
|
}
|
|
|
|
return (FALSE); // Didn't process the message
|
|
|
|
lParam;
|
|
} // DlgGetServ
|
|
|
|
|
|
/*+-------------------------------------------------------------------------+
|
|
| DialogGetServ()
|
|
|
|
|
+-------------------------------------------------------------------------+*/
|
|
DWORD DialogServerBrowse(HINSTANCE hInst, HWND hDlg, SOURCE_SERVER_BUFFER **lpSourceServer, DEST_SERVER_BUFFER **lpDestServer) {
|
|
DLGPROC lpfnDlg;
|
|
|
|
SServListCurrent = NULL;
|
|
DServListCurrent = NULL;
|
|
SServ = NULL;
|
|
DServ = NULL;
|
|
|
|
lpfnDlg = MakeProcInstance((DLGPROC)DlgGetServ, hInst);
|
|
DialogBox(hInst, TEXT("DlgGetServ"), hDlg, lpfnDlg) ;
|
|
FreeProcInstance(lpfnDlg);
|
|
|
|
if (DlgOk) {
|
|
*lpSourceServer = SServ;
|
|
*lpDestServer = DServ;
|
|
return 0;
|
|
} else
|
|
return 1;
|
|
|
|
} // DialogServerBrowse
|