381 lines
9.5 KiB
C
381 lines
9.5 KiB
C
|
/****************************** Module Header ******************************\
|
||
|
* Module Name: net.c
|
||
|
*
|
||
|
* PURPOSE: Contains routines network support
|
||
|
*
|
||
|
* Created: Feb 1991
|
||
|
*
|
||
|
* Copyright (c) 1991 Microsoft Corporation
|
||
|
*
|
||
|
* History:
|
||
|
* Srinik 02\12\1190 Orginal
|
||
|
* curts created portable version for WIN16/32
|
||
|
*
|
||
|
\***************************************************************************/
|
||
|
|
||
|
#include <windows.h>
|
||
|
|
||
|
#ifdef WIN16
|
||
|
#include <winnet.h>
|
||
|
#endif
|
||
|
|
||
|
#ifdef WIN32
|
||
|
#include <winnetwk.h>
|
||
|
#endif
|
||
|
|
||
|
#include "dll.h"
|
||
|
|
||
|
#define MAX_DRIVE 26
|
||
|
|
||
|
char szNULL[] = "";
|
||
|
char szNetName[]= "NetName";
|
||
|
|
||
|
|
||
|
BOOL FAR PASCAL GetTaskVisibleWindow (HWND, LPARAM);
|
||
|
void INTERNAL RemoveNetName (LPOBJECT_LE);
|
||
|
|
||
|
// Gets the drive letter from topic (if one exists) and then gets the remote
|
||
|
// name for that drive and then saves it in the object.
|
||
|
|
||
|
OLESTATUS FARINTERNAL SetNetName (
|
||
|
LPOBJECT_LE lpobj
|
||
|
){
|
||
|
char buf[MAX_STR];
|
||
|
WORD2DWORD cbBuf = sizeof(buf);
|
||
|
WORD2DWORD driveType;
|
||
|
char szDrive[3];
|
||
|
|
||
|
if (lpobj->head.ctype == CT_EMBEDDED)
|
||
|
return OLE_OK;
|
||
|
|
||
|
if (!GlobalGetAtomName (lpobj->topic, buf, cbBuf))
|
||
|
return OLE_ERROR_BLANK;
|
||
|
|
||
|
if (buf[1] != ':') {
|
||
|
RemoveNetName (lpobj);
|
||
|
return OLE_OK;
|
||
|
}
|
||
|
|
||
|
szDrive[2] = '\0';
|
||
|
szDrive[1] = ':';
|
||
|
szDrive[0] = buf[0];
|
||
|
AnsiUpperBuff ((LPSTR) szDrive, 1);
|
||
|
|
||
|
if (!(driveType = GetDriveType (MAPVALUE(szDrive[0] - 'A',szDrive)) )) {
|
||
|
// drive is non existent
|
||
|
return OLE_ERROR_DRIVE;
|
||
|
}
|
||
|
|
||
|
if (driveType == DRIVE_REMOTE) {
|
||
|
if (WNetGetConnection (szDrive, buf, (MAPTYPE(LPWORD,LPDWORD)) &cbBuf)
|
||
|
!= WN_SUCCESS)
|
||
|
return OLE_ERROR_DRIVE;
|
||
|
|
||
|
lpobj->cDrive = szDrive[0];
|
||
|
if (lpobj->aNetName)
|
||
|
GlobalDeleteAtom (lpobj->aNetName);
|
||
|
lpobj->aNetName = GlobalAddAtom(buf);
|
||
|
#ifdef WIN16
|
||
|
lpobj->dwNetInfo = MAKELONG((WNetGetCaps (WNNC_NET_TYPE)),
|
||
|
(WNetGetCaps (WNNC_DRIVER_VERSION)));
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
else {
|
||
|
RemoveNetName (lpobj);
|
||
|
}
|
||
|
|
||
|
return OLE_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
// If netname exists for the given object, then it makes sure that drive
|
||
|
// in topic corresponds to the netname. If it's not the drive letter will
|
||
|
// be fixed by calling FixNet()
|
||
|
|
||
|
OLESTATUS FARINTERNAL CheckNetDrive (
|
||
|
LPOBJECT_LE lpobj,
|
||
|
BOOL fNetDlg
|
||
|
){
|
||
|
char buf[MAX_NET_NAME];
|
||
|
char netName[MAX_NET_NAME];
|
||
|
WORD2DWORD cbBuf = sizeof(buf);
|
||
|
char szDrive[3];
|
||
|
|
||
|
if (lpobj->head.ctype == CT_EMBEDDED)
|
||
|
return OLE_OK;
|
||
|
|
||
|
if (!lpobj->aNetName)
|
||
|
return OLE_OK;
|
||
|
|
||
|
if (!GlobalGetAtomName (lpobj->aNetName, netName, sizeof(netName)))
|
||
|
return OLE_ERROR_MEMORY;
|
||
|
|
||
|
szDrive[2] = '\0';
|
||
|
szDrive[1] = ':';
|
||
|
if (!(szDrive[0] = lpobj->cDrive)) {
|
||
|
if (GlobalGetAtomName (lpobj->topic, buf, sizeof(buf)))
|
||
|
szDrive[0] = lpobj->cDrive = buf[0];
|
||
|
}
|
||
|
|
||
|
if ((WNetGetConnection (szDrive, buf, (MAPTYPE(LPWORD,LPDWORD)) &cbBuf)
|
||
|
== WN_SUCCESS) && (!lstrcmp(netName, buf)))
|
||
|
return OLE_OK;
|
||
|
|
||
|
return FixNet (lpobj, netName, fNetDlg);
|
||
|
}
|
||
|
|
||
|
|
||
|
// Find if there is a drive connected to the given server. If so, get the
|
||
|
// drive letter and set it in topic. If not try to make connection, and if
|
||
|
// that attempt is successful the set the drive letter in topic.
|
||
|
|
||
|
OLESTATUS INTERNAL FixNet (
|
||
|
LPOBJECT_LE lpobj,
|
||
|
LPSTR lpNetName,
|
||
|
BOOL fNetDlg
|
||
|
){
|
||
|
int nDrive = 2; // drive 'C'
|
||
|
OLESTATUS retVal;
|
||
|
|
||
|
if (SetNextNetDrive(lpobj, &nDrive, lpNetName))
|
||
|
return OLE_OK;
|
||
|
|
||
|
if (fNetDlg != POPUP_NETDLG)
|
||
|
return OLE_ERROR_NETWORK;
|
||
|
|
||
|
if ((retVal = ConnectNet (lpobj, lpNetName)) == OLE_OK) {
|
||
|
if (!ChangeTopic (lpobj))
|
||
|
return OLE_ERROR_BLANK;
|
||
|
}
|
||
|
|
||
|
return retVal;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
BOOL FARINTERNAL SetNextNetDrive (
|
||
|
LPOBJECT_LE lpobj,
|
||
|
int FAR * lpnDrive,
|
||
|
LPSTR lpNetName
|
||
|
){
|
||
|
char buf[MAX_STR];
|
||
|
WORD2DWORD cbBuf = sizeof(buf);
|
||
|
char szDrive[3];
|
||
|
|
||
|
if (!lpNetName[0]) {
|
||
|
if (!GlobalGetAtomName(lpobj->aNetName, lpNetName, MAX_STR))
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
szDrive[2] = '\0';
|
||
|
szDrive[1] = ':';
|
||
|
while (*lpnDrive < MAX_DRIVE) {
|
||
|
szDrive[0] = (char) ('A' + (++*lpnDrive));
|
||
|
if (GetDriveType (szDrive) == DRIVE_REMOTE) {
|
||
|
#ifdef WIN16
|
||
|
if (GetDriveType (++*lpnDrive) == DRIVE_REMOTE) {
|
||
|
#endif
|
||
|
cbBuf = sizeof(buf);
|
||
|
if ((WNetGetConnection (szDrive, buf, (MAPTYPE(LPWORD,LPDWORD)) &cbBuf)
|
||
|
== WN_SUCCESS) && (!lstrcmp(lpNetName, buf))) {
|
||
|
lpobj->cDrive = szDrive[0];
|
||
|
return ChangeTopic (lpobj);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL FARINTERNAL ChangeTopic (
|
||
|
LPOBJECT_LE lpobj
|
||
|
){
|
||
|
char buf[MAX_STR];
|
||
|
|
||
|
if (!GlobalGetAtomName(lpobj->topic, buf, sizeof(buf)))
|
||
|
return FALSE;
|
||
|
if (lpobj->topic)
|
||
|
GlobalDeleteAtom(lpobj->topic);
|
||
|
buf[0] = lpobj->cDrive;
|
||
|
lpobj->topic = GlobalAddAtom (buf);
|
||
|
if (lpobj->hLink) {
|
||
|
GlobalFree (lpobj->hLink);
|
||
|
lpobj->hLink = NULL;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
OLESTATUS INTERNAL ConnectNet (
|
||
|
LPOBJECT_LE lpobj,
|
||
|
LPSTR lpNetName
|
||
|
){
|
||
|
HWND hCurTask;
|
||
|
HWND hwndParent = NULL;
|
||
|
|
||
|
|
||
|
hCurTask = (HWND)ULongToPtr(MGetCurrentTask());
|
||
|
ASSERT (hCurTask, "Current task handle in NULL");
|
||
|
|
||
|
// Get the container task's main window, and use that as parent for
|
||
|
// the dlg box.
|
||
|
EnumTaskWindows (hCurTask, (WNDENUMPROC)GetTaskVisibleWindow,
|
||
|
(DWORD_PTR) ((WORD FAR *) &hwndParent));
|
||
|
|
||
|
if (lpobj->cDrive = (char) DialogBoxParam (hInstDLL, "CONNECTDLG",
|
||
|
hwndParent, ConnectDlgProc,
|
||
|
(LONG_PTR) lpNetName))
|
||
|
return OLE_OK;
|
||
|
else
|
||
|
return OLE_ERROR_NETWORK;
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
INT_PTR FAR PASCAL ConnectDlgProc(
|
||
|
HWND hDlg,
|
||
|
UINT wMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
){
|
||
|
char szPassword[32];
|
||
|
char szTitle[64];
|
||
|
|
||
|
switch (wMsg) {
|
||
|
case WM_INITDIALOG:
|
||
|
SetProp (hDlg, szNetName, (HANDLE)lParam);
|
||
|
FillDrives (hDlg);
|
||
|
SetDlgItemText (hDlg, IDD_PATH, (LPSTR) lParam);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
switch (GET_WM_COMMAND_ID(wParam,lParam)) {
|
||
|
|
||
|
case IDOK:
|
||
|
{
|
||
|
int cch = 128;
|
||
|
char szMessage[128];
|
||
|
char szDrive[3];
|
||
|
LPSTR lpNetName;
|
||
|
|
||
|
GetDlgItemText(hDlg, IDD_DRIVE, szDrive, sizeof(szDrive));
|
||
|
GetDlgItemText(hDlg, IDD_PASSWORD, szPassword,
|
||
|
sizeof(szPassword));
|
||
|
lpNetName = (LPSTR) GetProp (hDlg, szNetName);
|
||
|
wParam = WNetAddConnection (lpNetName,
|
||
|
(LPSTR) szPassword, szDrive);
|
||
|
|
||
|
if (wParam == WN_SUCCESS) {
|
||
|
RemoveProp (hDlg, szNetName);
|
||
|
EndDialog (hDlg, szDrive[0]);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
LoadString (hInstDLL, IDS_NETERR, szTitle,
|
||
|
sizeof(szTitle));
|
||
|
#ifdef WIN16
|
||
|
if (WNetGetErrorText ((UINT)wParam, szMessage, &cch)
|
||
|
!= WN_SUCCESS)
|
||
|
#endif
|
||
|
LoadString (hInstDLL, IDS_NETCONERRMSG,
|
||
|
szMessage, sizeof(szMessage));
|
||
|
|
||
|
if (MessageBox (hDlg, szMessage, szTitle,
|
||
|
MB_RETRYCANCEL) == IDCANCEL)
|
||
|
goto error;
|
||
|
|
||
|
if (wParam == WN_ALREADY_CONNECTED)
|
||
|
FillDrives (hDlg);
|
||
|
SetDlgItemText (hDlg, IDD_PASSWORD, szNULL);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case IDCANCEL:
|
||
|
error:
|
||
|
RemoveProp (hDlg, szNetName);
|
||
|
EndDialog(hDlg, 0);
|
||
|
return TRUE;
|
||
|
|
||
|
case IDD_DRIVE:
|
||
|
break;
|
||
|
|
||
|
case IDD_PATH:
|
||
|
if (GET_WM_COMMAND_CMD(wParam,lParam) == EN_KILLFOCUS) {
|
||
|
LPSTR lpNetName;
|
||
|
|
||
|
lpNetName = (LPSTR) GetProp (hDlg, szNetName);
|
||
|
|
||
|
SendDlgItemMessage (hDlg, IDD_PATH, WM_SETTEXT, 0,
|
||
|
(DWORD_PTR) lpNetName);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID INTERNAL FillDrives (
|
||
|
HWND hDlg
|
||
|
){
|
||
|
HWND hwndCB;
|
||
|
int nDrive = 3;
|
||
|
char szDrive[3];
|
||
|
DWORD dwDriveType;
|
||
|
|
||
|
hwndCB = GetDlgItem(hDlg, IDD_DRIVE);
|
||
|
SendMessage(hwndCB, CB_RESETCONTENT, 0, 0L);
|
||
|
szDrive[2] = '\0';
|
||
|
szDrive[1] = ':';
|
||
|
while (nDrive < MAX_DRIVE) {
|
||
|
szDrive[0] = (char) ('A' + nDrive);
|
||
|
#ifdef WIN32
|
||
|
if ((dwDriveType = GetDriveType (szDrive)) == 1)
|
||
|
#endif
|
||
|
#ifdef WIN16
|
||
|
if (!GetDriveType (nDrive))
|
||
|
#endif
|
||
|
SendMessage(hwndCB, CB_ADDSTRING, 0, (DWORD_PTR)(LPSTR)szDrive);
|
||
|
nDrive++;
|
||
|
}
|
||
|
SendMessage(hwndCB, CB_SETCURSEL, 0, 0L);
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL FAR PASCAL GetTaskVisibleWindow (
|
||
|
HWND hWnd,
|
||
|
LPARAM lpTaskVisWnd
|
||
|
){
|
||
|
if (IsWindowVisible (hWnd)) {
|
||
|
*(HWND FAR *)lpTaskVisWnd = hWnd;
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
void INTERNAL RemoveNetName (LPOBJECT_LE lpobj)
|
||
|
{
|
||
|
if (lpobj->aNetName) {
|
||
|
GlobalDeleteAtom (lpobj->aNetName);
|
||
|
lpobj->aNetName = (ATOM)0;
|
||
|
}
|
||
|
|
||
|
lpobj->cDrive = '\0';
|
||
|
}
|
||
|
|