diff options
Diffstat (limited to '')
-rw-r--r-- | private/nw/convert/nwconv/sbrowse.c | 1153 |
1 files changed, 1153 insertions, 0 deletions
diff --git a/private/nw/convert/nwconv/sbrowse.c b/private/nw/convert/nwconv/sbrowse.c new file mode 100644 index 000000000..9ee80657c --- /dev/null +++ b/private/nw/convert/nwconv/sbrowse.c @@ -0,0 +1,1153 @@ +/* + +-------------------------------------------------------------------------+ + | 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 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 = DialogBox(hInst, TEXT("DlgServSel"), hwndOwner, lpfndp) ; + + FreeProcInstance((FARPROC)lpfndp); + HierDraw_DrawTerm(&HierDrawStruct); + + return result; +} // DlgServSel_Do + + + +/*+-------------------------------------------------------------------------+ + | BrowseListFind() + | + +-------------------------------------------------------------------------+*/ +SERVER_BROWSE_BUFFER *BrowseListFind(DWORD 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 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 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 dwData, WORD wItemNum) { + DWORD 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; + } + +} // 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 |