|
|
/*++
Copyright (C) 1996 Microsoft Corporation
Module Name:
nwatch95.c
Abstract:
Attachment routines for Win95 Author:
Felix Wong [t-felixw] 6-Sep-1996
Revision History:
--*/
#include "procs.h"
#include "nw95.h"
BOOLEAN* NlsMbOemCodePageTag = FALSE;
typedef struct _NWC_SERVER_INFO { HANDLE hConn ; UNICODE_STRING ServerString ; } NWC_SERVER_INFO, *PNWC_SERVER_INFO ;
DWORD szToWide( LPWSTR lpszW, LPCSTR lpszC, INT nSize );
HINSTANCE g_hinstDLL = NULL;
// Forwards
NWCCODE NWAttachToFileServerWin95( LPCSTR pszServerName, WORD ScopeFlag, NW_CONN_HANDLE *phNewConn );
NWCCODE NWDetachFromFileServerWin95( NW_CONN_HANDLE hConn );
DWORD WideToSz( LPSTR lpszC, LPCWSTR lpszW, INT nSize ) { if (!WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK | WC_SEPCHARS, lpszW, -1, lpszC, nSize, NULL, NULL)) { return (GetLastError()) ; } return NO_ERROR ; }
NWCCODE NWAPI DLLEXPORT NWDetachFromFileServer( NWCONN_HANDLE hConn ) { NWCCODE nwccode; PNWC_SERVER_INFO pServerInfo; if (!hConn) return (NWCCODE)UNSUCCESSFUL; pServerInfo = (PNWC_SERVER_INFO)hConn ;
// Do not detach server since Win95 does not have reference count. We will just
// wait for it to waitout and disconnect itself.
// This is suggested by VladS.
//nwccode = NWDetachFromFileServerWin95(pServerInfo->hConn);
nwccode = SUCCESSFUL;
if (pServerInfo->ServerString.Buffer != NULL) { (void) LocalFree (pServerInfo->ServerString.Buffer); pServerInfo->ServerString.Buffer = NULL; }
pServerInfo->hConn = NULL ; (void) LocalFree (pServerInfo) ;
return nwccode; }
NWCCODE NWAPI DLLEXPORT NWAttachToFileServerW( const WCHAR NWFAR *pwszServerName, NWLOCAL_SCOPE ScopeFlag, NWCONN_HANDLE NWFAR *phNewConn ) { NW_STATUS NwStatus; LPWSTR lpwszServerName = NULL; // Pointer to buffer for WIDE servername
LPSTR lpszServerName = NULL; int nSize; PNWC_SERVER_INFO pServerInfo = NULL;
UNREFERENCED_PARAMETER(ScopeFlag) ;
//
// check parameters and init return result to be null.
//
if (!pwszServerName || !phNewConn) return INVALID_CONNECTION ;
*phNewConn = NULL ;
// Setup lpszServerName, used to pass into NWAttachToFileServerWin95
nSize = wcslen(pwszServerName) + 1;
if(!(lpszServerName = (LPSTR) LocalAlloc( LPTR, nSize * sizeof(CHAR) ))) { NwStatus = REQUESTER_ERROR ; goto ExitPoint ; } if (WideToSz( lpszServerName, pwszServerName, nSize ) != NO_ERROR) { NwStatus = REQUESTER_ERROR ; goto ExitPoint ; }
// Setup lpwszServerName, used as storage in server handle
nSize = nSize+2 ; // Adding 2 for the '\\'
if(!(lpwszServerName = (LPWSTR) LocalAlloc( LPTR, nSize * sizeof(WCHAR) ))) { NwStatus = REQUESTER_ERROR ; goto ExitPoint ; } wcscpy( lpwszServerName, L"\\\\" ); wcscat( lpwszServerName, pwszServerName );
//
// Allocate a buffer for the server info (handle + name pointer). Also
// init the unicode string.
//
if( !(pServerInfo = (PNWC_SERVER_INFO) LocalAlloc( LPTR, sizeof(NWC_SERVER_INFO))) ) { NwStatus = REQUESTER_ERROR ; goto ExitPoint ; } RtlInitUnicodeString(&pServerInfo->ServerString, lpwszServerName) ;
if (wcscmp(pwszServerName,L"*") != 0) { NwStatus = NWAttachToFileServerWin95( lpszServerName, ScopeFlag, &pServerInfo->hConn ); } else { // hConn of NULL works as nearest server in Win95
pServerInfo->hConn = NULL; NwStatus = SUCCESSFUL; }
ExitPoint:
//
// Free the memory allocated above before exiting
//
if (lpszServerName) (void) LocalFree( (HLOCAL) lpszServerName ); if (NwStatus != SUCCESSFUL) { // only deallocate if unsucessful, or else it will
// be stored in pServerInfo->ServerString
if (lpwszServerName) (void) LocalFree( (HLOCAL) lpwszServerName ); if (pServerInfo) (void) LocalFree( (HLOCAL) pServerInfo ); } else { *phNewConn = (HANDLE) pServerInfo ; }
//
// Return with NWCCODE
//
return( (NWCCODE)NwStatus ); }
NWCCODE NWAPI DLLEXPORT NWAttachToFileServer( const CHAR NWFAR *pszServerName, NWLOCAL_SCOPE ScopeFlag, NWCONN_HANDLE NWFAR *phNewConn ) { NW_STATUS NwStatus; LPWSTR lpwszServerName = NULL; // Pointer to buffer for WIDE servername
LPWSTR lpwszServerNameTmp = NULL; int nSize; PNWC_SERVER_INFO pServerInfo = NULL;
UNREFERENCED_PARAMETER(ScopeFlag) ;
//
// check parameters and init return result to be null.
//
if (!pszServerName || !phNewConn) return INVALID_CONNECTION ;
*phNewConn = NULL ; nSize = strlen(pszServerName) + 1; // Setup lpwszServerNameTmp
if(!(lpwszServerNameTmp = (LPWSTR) LocalAlloc( LPTR, nSize * sizeof(WCHAR) ))) { NwStatus = REQUESTER_ERROR ; goto ExitPoint ; } if (szToWide( lpwszServerNameTmp, pszServerName, nSize ) != NO_ERROR) { NwStatus = REQUESTER_ERROR ; goto ExitPoint ; } // Setup lpwszServerName for storage in server handle
nSize = nSize + 2; if(!(lpwszServerName = (LPWSTR) LocalAlloc( LPTR, nSize * sizeof(WCHAR) ))) { NwStatus = REQUESTER_ERROR ; goto ExitPoint ; } wcscpy( lpwszServerName, L"\\\\" ); wcscat( lpwszServerName, lpwszServerNameTmp );
//
// Allocate a buffer for the server info (handle + name pointer). Also
// init the unicode string.
//
if( !(pServerInfo = (PNWC_SERVER_INFO) LocalAlloc( LPTR, sizeof(NWC_SERVER_INFO))) ) { NwStatus = REQUESTER_ERROR ; goto ExitPoint ; } RtlInitUnicodeString(&pServerInfo->ServerString, lpwszServerName) ;
if (strcmp(pszServerName,"*") != 0) { NwStatus = NWAttachToFileServerWin95( pszServerName, ScopeFlag, &pServerInfo->hConn ); } else { // hConn of NULL works as nearest server in Win95
pServerInfo->hConn = NULL; NwStatus = SUCCESSFUL; }
ExitPoint:
//
// Free the memory allocated above before exiting
//
if (lpwszServerNameTmp) (void) LocalFree( (HLOCAL) lpwszServerNameTmp ); if (NwStatus != SUCCESSFUL) { // only deallocate if unsucessful, or else it will
// be stored in pServerInfo->ServerString
if (lpwszServerName) (void) LocalFree( (HLOCAL) lpwszServerName ); if (pServerInfo) (void) LocalFree( (HLOCAL) pServerInfo ); } else { *phNewConn = (HANDLE) pServerInfo ; } //
// Return with NWCCODE
//
return( (NWCCODE)NwStatus ); }
NWCCODE NWAttachToFileServerWin95( LPCSTR pszServerName, WORD ScopeFlag, NW_CONN_HANDLE *phNewConn ) { NW_STATUS nwstatusReturn = UNSUCCESSFUL; NW_STATUS (*lpfnAttachToFileServerWin95) (LPCSTR, WORD, NW_CONN_HANDLE ); /* Load the NWAPI32.DLL library module. */ if (g_hinstDLL == NULL) g_hinstDLL = LoadLibraryA("NWAPI32.DLL"); if (g_hinstDLL == NULL) { goto Exit; } (FARPROC) lpfnAttachToFileServerWin95 = GetProcAddress(g_hinstDLL, "NWAttachToFileServer"); if (lpfnAttachToFileServerWin95 == NULL) goto Exit;
nwstatusReturn = (*lpfnAttachToFileServerWin95) (pszServerName, ScopeFlag, phNewConn ); Exit: //FreeLibrary(hinstDLL);
return (NWCCODE)nwstatusReturn; }
NWCCODE NWDetachFromFileServerWin95( NW_CONN_HANDLE hConn ) { NW_STATUS nwstatusReturn = UNSUCCESSFUL; NW_STATUS (*lpfnDetachFromFileServerWin95) (NW_CONN_HANDLE); /* Load the NWAPI32.DLL library module. */ if (g_hinstDLL == NULL) g_hinstDLL = LoadLibraryA("NWAPI32.DLL"); if (g_hinstDLL == NULL) goto Exit; (FARPROC) lpfnDetachFromFileServerWin95 = GetProcAddress(g_hinstDLL, "NWDetachFromFileServer"); if (lpfnDetachFromFileServerWin95 == NULL) goto Exit;
nwstatusReturn = (*lpfnDetachFromFileServerWin95) (hConn); Exit: //FreeLibrary(hinstDLL);
return (NWCCODE)nwstatusReturn; }
|