455 lines
14 KiB
C
455 lines
14 KiB
C
/*
|
|
* USER Windows Network functions
|
|
*/
|
|
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
#include <sys/types.h>
|
|
#include <pwd.h>
|
|
#include <unistd.h>
|
|
|
|
#include "winbase.h"
|
|
#include "wine/winnet16.h"
|
|
#include "winnetwk.h"
|
|
#include "drive.h"
|
|
#include "debugtools.h"
|
|
#include "heap.h"
|
|
|
|
DEFAULT_DEBUG_CHANNEL(wnet)
|
|
|
|
/*
|
|
* Remote printing
|
|
*/
|
|
|
|
/**************************************************************************
|
|
* WNetOpenJob16 [USER.501]
|
|
*/
|
|
WORD WINAPI WNetOpenJob16( LPSTR szQueue, LPSTR szJobTitle, WORD nCopies, LPINT16 pfh )
|
|
{
|
|
FIXME( "(%s, %s, %d, %p): stub\n",
|
|
debugstr_a(szQueue), debugstr_a(szJobTitle), nCopies, pfh );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetCloseJob16 [USER.502]
|
|
*/
|
|
WORD WINAPI WNetCloseJob16( WORD fh, LPINT16 pidJob, LPSTR szQueue )
|
|
{
|
|
FIXME( "(%d, %p, %s): stub\n", fh, pidJob, debugstr_a(szQueue) );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetWriteJob16 [USER.524]
|
|
*/
|
|
WORD WINAPI WNetWriteJob16( HANDLE16 hJob, LPSTR lpData, LPINT16 lpcbData )
|
|
{
|
|
FIXME( "(%04x, %p, %p): stub\n", hJob, lpData, lpcbData );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetAbortJob16 [USER.503]
|
|
*/
|
|
WORD WINAPI WNetAbortJob16( LPSTR szQueue, WORD wJobId )
|
|
{
|
|
FIXME( "(%s, %d): stub\n", debugstr_a(szQueue), wJobId );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetHoldJob16 [USER.504]
|
|
*/
|
|
WORD WINAPI WNetHoldJob16( LPSTR szQueue, WORD wJobId )
|
|
{
|
|
FIXME( "(%s, %d): stub\n", debugstr_a(szQueue), wJobId );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetReleaseJob16 [USER.505]
|
|
*/
|
|
WORD WINAPI WNetReleaseJob16( LPSTR szQueue, WORD wJobId )
|
|
{
|
|
FIXME( "(%s, %d): stub\n", debugstr_a(szQueue), wJobId );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetCancelJob16 [USER.506]
|
|
*/
|
|
WORD WINAPI WNetCancelJob16( LPSTR szQueue, WORD wJobId )
|
|
{
|
|
FIXME( "(%s, %d): stub\n", debugstr_a(szQueue), wJobId );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetSetJobCopies16 [USER.507]
|
|
*/
|
|
WORD WINAPI WNetSetJobCopies16( LPSTR szQueue, WORD wJobId, WORD nCopies )
|
|
{
|
|
FIXME( "(%s, %d, %d): stub\n", debugstr_a(szQueue), wJobId, nCopies );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetWatchQueue16 [USER.508]
|
|
*/
|
|
WORD WINAPI WNetWatchQueue16( HWND16 hWnd, LPSTR szLocal, LPSTR szUser, WORD nQueue )
|
|
{
|
|
FIXME( "(%04x, %s, %s, %d): stub\n",
|
|
hWnd, debugstr_a(szLocal), debugstr_a(szUser), nQueue );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetUnwatchQueue16 [USER.509]
|
|
*/
|
|
WORD WINAPI WNetUnwatchQueue16( LPSTR szQueue )
|
|
{
|
|
FIXME( "(%s): stub\n", debugstr_a(szQueue) );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetLockQueueData16 [USER.510]
|
|
*/
|
|
WORD WINAPI WNetLockQueueData16( LPSTR szQueue, LPSTR szUser,
|
|
LPQUEUESTRUCT16 *lplpQueueStruct )
|
|
{
|
|
FIXME( "(%s, %s, %p): stub\n",
|
|
debugstr_a(szQueue), debugstr_a(szUser), lplpQueueStruct );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetUnlockQueueData16 [USER.511]
|
|
*/
|
|
WORD WINAPI WNetUnlockQueueData16( LPSTR szQueue )
|
|
{
|
|
FIXME( "(%s): stub\n", debugstr_a(szQueue) );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
|
|
/*
|
|
* Connections
|
|
*/
|
|
|
|
/********************************************************************
|
|
* WNetAddConnection16 [USER.517] Directs a local device to net
|
|
*
|
|
* Redirects a local device (either a disk drive or printer port)
|
|
* to a shared device on a remote server.
|
|
*/
|
|
WORD WINAPI WNetAddConnection16( LPSTR lpNetPath, LPSTR lpPassWord,
|
|
LPSTR lpLocalName )
|
|
{
|
|
FIXME( "(%s, %p, %s): stub\n",
|
|
debugstr_a(lpNetPath), lpPassWord, debugstr_a(lpLocalName) );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/********************************************************************
|
|
* WNetCancelConnection16 [USER.518] undirects a local device
|
|
*/
|
|
WORD WINAPI WNetCancelConnection16( LPSTR lpName, BOOL16 bForce )
|
|
{
|
|
FIXME( "(%s, %04X): stub\n", debugstr_a(lpName), bForce);
|
|
return WN16_NOT_SUPPORTED;
|
|
}
|
|
|
|
/********************************************************************
|
|
* WNetGetConnection16 [USER.512] reverse-resolves a local device
|
|
*/
|
|
WORD WINAPI WNetGetConnection16( LPSTR lpLocalName,
|
|
LPSTR lpRemoteName, UINT16 *cbRemoteName )
|
|
{
|
|
const char *path;
|
|
|
|
TRACE( "local %s\n", lpLocalName );
|
|
if (lpLocalName[1] == ':')
|
|
{
|
|
int drive = toupper(lpLocalName[0]) - 'A';
|
|
switch(DRIVE_GetType(drive))
|
|
{
|
|
case TYPE_INVALID:
|
|
return WN16_BAD_LOCALNAME;
|
|
case TYPE_NETWORK:
|
|
path = DRIVE_GetLabel(drive);
|
|
if (strlen(path) + 1 > *cbRemoteName)
|
|
{
|
|
*cbRemoteName = strlen(path) + 1;
|
|
return WN16_MORE_DATA;
|
|
}
|
|
strcpy( lpRemoteName, path );
|
|
*cbRemoteName = strlen(lpRemoteName) + 1;
|
|
return WN16_SUCCESS;
|
|
case TYPE_FLOPPY:
|
|
case TYPE_HD:
|
|
case TYPE_CDROM:
|
|
TRACE("file is local\n");
|
|
return WN16_NOT_CONNECTED;
|
|
default:
|
|
return WN16_BAD_LOCALNAME;
|
|
}
|
|
}
|
|
return WN16_BAD_LOCALNAME;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetRestoreConnection16 [USER.523]
|
|
*/
|
|
WORD WINAPI WNetRestoreConnection16( HWND16 hwndOwner, LPSTR lpszDevice )
|
|
{
|
|
FIXME( "(%04x, %s): stub\n", hwndOwner, debugstr_a(lpszDevice) );
|
|
return WN16_NOT_SUPPORTED;
|
|
}
|
|
|
|
|
|
/*
|
|
* Capabilities
|
|
*/
|
|
|
|
/**************************************************************************
|
|
* WNetGetCaps16 [USER.513]
|
|
*/
|
|
WORD WINAPI WNetGetCaps16( WORD capability )
|
|
{
|
|
switch (capability)
|
|
{
|
|
case WNNC16_SPEC_VERSION:
|
|
return 0x30a; /* WfW 3.11 (and apparently other 3.1x) */
|
|
|
|
case WNNC16_NET_TYPE:
|
|
/* hi byte = network type,
|
|
lo byte = network vendor (Netware = 0x03) [15 types] */
|
|
return WNNC16_NET_MultiNet | WNNC16_SUBNET_WinWorkgroups;
|
|
|
|
case WNNC16_DRIVER_VERSION:
|
|
/* driver version of vendor */
|
|
return 0x100; /* WfW 3.11 */
|
|
|
|
case WNNC16_USER:
|
|
/* 1 = WNetGetUser is supported */
|
|
return 1;
|
|
|
|
case WNNC16_CONNECTION:
|
|
/* returns mask of the supported connection functions */
|
|
return WNNC16_CON_AddConnection | WNNC16_CON_CancelConnection
|
|
| WNNC16_CON_GetConnections /* | WNNC16_CON_AutoConnect */
|
|
| WNNC16_CON_BrowseDialog | WNNC16_CON_RestoreConnection;
|
|
|
|
case WNNC16_PRINTING:
|
|
/* returns mask of the supported printing functions */
|
|
return WNNC16_PRT_OpenJob | WNNC16_PRT_CloseJob | WNNC16_PRT_HoldJob
|
|
| WNNC16_PRT_ReleaseJob | WNNC16_PRT_CancelJob
|
|
| WNNC16_PRT_SetJobCopies | WNNC16_PRT_WatchQueue
|
|
| WNNC16_PRT_UnwatchQueue | WNNC16_PRT_LockQueueData
|
|
| WNNC16_PRT_UnlockQueueData | WNNC16_PRT_AbortJob
|
|
| WNNC16_PRT_WriteJob;
|
|
|
|
case WNNC16_DIALOG:
|
|
/* returns mask of the supported dialog functions */
|
|
return WNNC16_DLG_DeviceMode | WNNC16_DLG_BrowseDialog
|
|
| WNNC16_DLG_ConnectDialog | WNNC16_DLG_DisconnectDialog
|
|
| WNNC16_DLG_ViewQueueDialog | WNNC16_DLG_PropertyDialog
|
|
| WNNC16_DLG_ConnectionDialog
|
|
/* | WNNC16_DLG_PrinterConnectDialog
|
|
| WNNC16_DLG_SharesDialog | WNNC16_DLG_ShareAsDialog */;
|
|
|
|
case WNNC16_ADMIN:
|
|
/* returns mask of the supported administration functions */
|
|
/* not sure if long file names is a good idea */
|
|
return WNNC16_ADM_GetDirectoryType
|
|
/* | WNNC16_ADM_DirectoryNotify */ /*not yet supported*/
|
|
| WNNC16_ADM_LongNames /* | WNNC16_ADM_SetDefaultDrive */;
|
|
|
|
case WNNC16_ERROR:
|
|
/* returns mask of the supported error functions */
|
|
return WNNC16_ERR_GetError | WNNC16_ERR_GetErrorText;
|
|
|
|
case WNNC16_PRINTMGREXT:
|
|
/* returns the Print Manager version in major and
|
|
minor format if Print Manager functions are available */
|
|
return 0x30e; /* printman version of WfW 3.11 */
|
|
|
|
case 0xffff:
|
|
/* Win 3.11 returns HMODULE of network driver here
|
|
FIXME: what should we return ?
|
|
logonoff.exe needs it, msmail crashes with wrong value */
|
|
return 0;
|
|
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* Get User
|
|
*/
|
|
|
|
/**************************************************************************
|
|
* WNetGetUser16 [USER.516]
|
|
*/
|
|
WORD WINAPI WNetGetUser16( LPCSTR lpName, LPSTR szUser, LPINT16 nBufferSize )
|
|
{
|
|
FIXME( "(%p, %p, %p): stub\n", lpName, szUser, nBufferSize );
|
|
return WN16_NOT_SUPPORTED;
|
|
}
|
|
|
|
|
|
/*
|
|
* Browsing
|
|
*/
|
|
|
|
/**************************************************************************
|
|
* WNetDeviceMode16 [USER.514]
|
|
*/
|
|
WORD WINAPI WNetDeviceMode16( HWND16 hWndOwner )
|
|
{
|
|
FIXME( "(%04x): stub\n", hWndOwner );
|
|
return WN16_NOT_SUPPORTED;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetBrowseDialog16 [USER.515]
|
|
*/
|
|
WORD WINAPI WNetBrowseDialog16( HWND16 hParent, WORD nType, LPSTR szPath )
|
|
{
|
|
FIXME( "(%04x, %x, %s): stub\n", hParent, nType, szPath );
|
|
return WN16_NOT_SUPPORTED;
|
|
}
|
|
|
|
/********************************************************************
|
|
* WNetConnectDialog [USER.525]
|
|
*/
|
|
WORD WINAPI WNetConnectDialog( HWND16 hWndParent, WORD iType )
|
|
{
|
|
FIXME( "(%04x, %x): stub\n", hWndParent, iType );
|
|
return WN16_SUCCESS;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetDisconnectDialog16 [USER.526]
|
|
*/
|
|
WORD WINAPI WNetDisconnectDialog16( HWND16 hwndOwner, WORD iType )
|
|
{
|
|
FIXME( "(%04x, %x): stub\n", hwndOwner, iType );
|
|
return WN16_NOT_SUPPORTED;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetConnectionDialog16 [USER.527]
|
|
*/
|
|
WORD WINAPI WNetConnectionDialog16( HWND16 hWndParent, WORD iType )
|
|
{
|
|
FIXME( "(%04x, %x): stub\n", hWndParent, iType );
|
|
return WN16_SUCCESS;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetViewQueueDialog16 [USER.528]
|
|
*/
|
|
WORD WINAPI WNetViewQueueDialog16( HWND16 hwndOwner, LPSTR lpszQueue )
|
|
{
|
|
FIXME(" (%04x, %s): stub\n", hwndOwner, debugstr_a(lpszQueue) );
|
|
return WN16_NOT_SUPPORTED;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetPropertyDialog16 [USER.529]
|
|
*/
|
|
WORD WINAPI WNetPropertyDialog16( HWND16 hwndParent, WORD iButton,
|
|
WORD nPropSel, LPSTR lpszName, WORD nType )
|
|
{
|
|
FIXME( "(%04x, %x, %x, %s, %x ): stub\n",
|
|
hwndParent, iButton, nPropSel, debugstr_a(lpszName), nType );
|
|
return WN16_NOT_SUPPORTED;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetGetPropertyText16 [USER.532]
|
|
*/
|
|
WORD WINAPI WNetGetPropertyText16( WORD iButton, WORD nPropSel, LPSTR lpszName,
|
|
LPSTR lpszButtonName, WORD cbButtonName, WORD nType )
|
|
{
|
|
FIXME( "(%04x, %04x, %s, %s, %04x): stub\n",
|
|
iButton, nPropSel, debugstr_a(lpszName), debugstr_a(lpszButtonName), nType);
|
|
return WN16_NOT_SUPPORTED;
|
|
}
|
|
|
|
|
|
/*
|
|
* Admin
|
|
*/
|
|
|
|
/*********************************************************************
|
|
* WNetGetDirectoryType16 [USER.530] Decides whether resource is local
|
|
*
|
|
* RETURNS
|
|
* on success, puts one of the following in *lpType:
|
|
* - WNDT_NETWORK on a network
|
|
* - WNDT_LOCAL local
|
|
*/
|
|
WORD WINAPI WNetGetDirectoryType16( LPSTR lpName, LPINT16 lpType )
|
|
{
|
|
UINT type = GetDriveTypeA(lpName);
|
|
if ( type == DRIVE_DOESNOTEXIST )
|
|
type = GetDriveTypeA(NULL);
|
|
|
|
*lpType = (type == DRIVE_REMOTE)? WNDT_NETWORK : WNDT_NORMAL;
|
|
|
|
TRACE( "%s is %s\n", debugstr_a(lpName),
|
|
(*lpType == WNDT_NETWORK)? "WNDT_NETWORK" : "WNDT_NORMAL" );
|
|
return WN16_SUCCESS;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetDirectoryNotify16 [USER.531]
|
|
*/
|
|
WORD WINAPI WNetDirectoryNotify16( HWND16 hwndOwner, LPSTR lpDir, WORD wOper )
|
|
{
|
|
FIXME( "(%04x, %s, %s): stub\n", hwndOwner, debugstr_a(lpDir),
|
|
(wOper == WNDN_MKDIR)? "WNDN_MKDIR" :
|
|
(wOper == WNDN_MVDIR)? "WNDN_MVDIR" :
|
|
(wOper == WNDN_RMDIR)? "WNDN_RMDIR" : "unknown" );
|
|
return WN16_NOT_SUPPORTED;
|
|
}
|
|
|
|
|
|
/*
|
|
* Error handling
|
|
*/
|
|
|
|
/**************************************************************************
|
|
* WNetGetError16 [USER.519]
|
|
*/
|
|
WORD WINAPI WNetGetError16( LPINT16 nError )
|
|
{
|
|
FIXME( "(%p): stub\n", nError );
|
|
return WN16_NOT_SUPPORTED;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetGetErrorText16 [USER.520]
|
|
*/
|
|
WORD WINAPI WNetGetErrorText16( WORD nError, LPSTR lpBuffer, LPINT16 nBufferSize )
|
|
{
|
|
FIXME( "(%x, %p, %p): stub\n", nError, lpBuffer, nBufferSize );
|
|
return WN16_NET_ERROR;
|
|
}
|
|
|
|
/**************************************************************************
|
|
* WNetErrorText16 [USER.499]
|
|
*/
|
|
WORD WINAPI WNetErrorText16( WORD nError, LPSTR lpszText, WORD cbText )
|
|
{
|
|
FIXME("(%x, %p, %x): stub\n", nError, lpszText, cbText );
|
|
return FALSE;
|
|
}
|
|
|