| /* | |
| * USER Windows Network functions | |
| * | |
| * Copyright 1995 Martin von Loewis | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| */ | |
| #include "config.h" | |
| #include <ctype.h> | |
| #include <stdarg.h> | |
| #include <string.h> | |
| #include <sys/types.h> | |
| #ifdef HAVE_UNISTD_H | |
| # include <unistd.h> | |
| #endif | |
| #include "windef.h" | |
| #include "winbase.h" | |
| #include "wine/winnet16.h" | |
| #include "wine/debug.h" | |
| WINE_DEFAULT_DEBUG_CHANNEL(wnet); | |
| /* | |
| * Remote printing | |
| */ | |
| /************************************************************************** | |
| * WNetOpenJob [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; | |
| } | |
| /************************************************************************** | |
| * WNetCloseJob [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; | |
| } | |
| /************************************************************************** | |
| * WNetWriteJob [USER.524] | |
| */ | |
| WORD WINAPI WNetWriteJob16( HANDLE16 hJob, LPSTR lpData, LPINT16 lpcbData ) | |
| { | |
| FIXME( "(%04x, %p, %p): stub\n", hJob, lpData, lpcbData ); | |
| return WN16_NET_ERROR; | |
| } | |
| /************************************************************************** | |
| * WNetAbortJob [USER.503] | |
| */ | |
| WORD WINAPI WNetAbortJob16( LPSTR szQueue, WORD wJobId ) | |
| { | |
| FIXME( "(%s, %d): stub\n", debugstr_a(szQueue), wJobId ); | |
| return WN16_NET_ERROR; | |
| } | |
| /************************************************************************** | |
| * WNetHoldJob [USER.504] | |
| */ | |
| WORD WINAPI WNetHoldJob16( LPSTR szQueue, WORD wJobId ) | |
| { | |
| FIXME( "(%s, %d): stub\n", debugstr_a(szQueue), wJobId ); | |
| return WN16_NET_ERROR; | |
| } | |
| /************************************************************************** | |
| * WNetReleaseJob [USER.505] | |
| */ | |
| WORD WINAPI WNetReleaseJob16( LPSTR szQueue, WORD wJobId ) | |
| { | |
| FIXME( "(%s, %d): stub\n", debugstr_a(szQueue), wJobId ); | |
| return WN16_NET_ERROR; | |
| } | |
| /************************************************************************** | |
| * WNetCancelJob [USER.506] | |
| */ | |
| WORD WINAPI WNetCancelJob16( LPSTR szQueue, WORD wJobId ) | |
| { | |
| FIXME( "(%s, %d): stub\n", debugstr_a(szQueue), wJobId ); | |
| return WN16_NET_ERROR; | |
| } | |
| /************************************************************************** | |
| * WNetSetJobCopies [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; | |
| } | |
| /************************************************************************** | |
| * WNetWatchQueue [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; | |
| } | |
| /************************************************************************** | |
| * WNetUnwatchQueue [USER.509] | |
| */ | |
| WORD WINAPI WNetUnwatchQueue16( LPSTR szQueue ) | |
| { | |
| FIXME( "(%s): stub\n", debugstr_a(szQueue) ); | |
| return WN16_NET_ERROR; | |
| } | |
| /************************************************************************** | |
| * WNetLockQueueData [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; | |
| } | |
| /************************************************************************** | |
| * WNetUnlockQueueData [USER.511] | |
| */ | |
| WORD WINAPI WNetUnlockQueueData16( LPSTR szQueue ) | |
| { | |
| FIXME( "(%s): stub\n", debugstr_a(szQueue) ); | |
| return WN16_NET_ERROR; | |
| } | |
| /* | |
| * Connections | |
| */ | |
| /******************************************************************** | |
| * WNetAddConnection [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; | |
| } | |
| /******************************************************************** | |
| * WNetCancelConnection [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; | |
| } | |
| /******************************************************************** | |
| * WNetGetConnection [USER.512] reverse-resolves a local device | |
| */ | |
| WORD WINAPI WNetGetConnection16( LPSTR lpLocalName, | |
| LPSTR lpRemoteName, UINT16 *cbRemoteName ) | |
| { | |
| char label[32]; | |
| TRACE( "local %s\n", lpLocalName ); | |
| switch(GetDriveTypeA(lpLocalName)) | |
| { | |
| case DRIVE_REMOTE: | |
| GetVolumeInformationA( lpLocalName, label, sizeof(label), NULL, NULL, NULL, NULL, 0 ); | |
| if (strlen(label) + 1 > *cbRemoteName) | |
| { | |
| *cbRemoteName = strlen(label) + 1; | |
| return WN16_MORE_DATA; | |
| } | |
| strcpy( lpRemoteName, label ); | |
| *cbRemoteName = strlen(lpRemoteName) + 1; | |
| return WN16_SUCCESS; | |
| case DRIVE_REMOVABLE: | |
| case DRIVE_FIXED: | |
| case DRIVE_CDROM: | |
| TRACE("file is local\n"); | |
| return WN16_NOT_CONNECTED; | |
| default: | |
| return WN16_BAD_LOCALNAME; | |
| } | |
| } | |
| /************************************************************************** | |
| * WNetRestoreConnection [USER.523] | |
| */ | |
| WORD WINAPI WNetRestoreConnection16( HWND16 hwndOwner, LPSTR lpszDevice ) | |
| { | |
| FIXME( "(%04x, %s): stub\n", hwndOwner, debugstr_a(lpszDevice) ); | |
| return WN16_NOT_SUPPORTED; | |
| } | |
| /* | |
| * Capabilities | |
| */ | |
| /************************************************************************** | |
| * WNetGetCaps [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 | |
| */ | |
| /************************************************************************** | |
| * WNetGetUser [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 | |
| */ | |
| /************************************************************************** | |
| * WNetDeviceMode [USER.514] | |
| */ | |
| WORD WINAPI WNetDeviceMode16( HWND16 hWndOwner ) | |
| { | |
| FIXME( "(%04x): stub\n", hWndOwner ); | |
| return WN16_NOT_SUPPORTED; | |
| } | |
| /************************************************************************** | |
| * WNetBrowseDialog [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; | |
| } | |
| /************************************************************************** | |
| * WNetDisconnectDialog [USER.526] | |
| */ | |
| WORD WINAPI WNetDisconnectDialog16( HWND16 hwndOwner, WORD iType ) | |
| { | |
| FIXME( "(%04x, %x): stub\n", hwndOwner, iType ); | |
| return WN16_NOT_SUPPORTED; | |
| } | |
| /************************************************************************** | |
| * WNetConnectionDialog [USER.527] | |
| */ | |
| WORD WINAPI WNetConnectionDialog16( HWND16 hWndParent, WORD iType ) | |
| { | |
| FIXME( "(%04x, %x): stub\n", hWndParent, iType ); | |
| return WN16_SUCCESS; | |
| } | |
| /************************************************************************** | |
| * WNetViewQueueDialog [USER.528] | |
| */ | |
| WORD WINAPI WNetViewQueueDialog16( HWND16 hwndOwner, LPSTR lpszQueue ) | |
| { | |
| FIXME(" (%04x, %s): stub\n", hwndOwner, debugstr_a(lpszQueue) ); | |
| return WN16_NOT_SUPPORTED; | |
| } | |
| /************************************************************************** | |
| * WNetPropertyDialog [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; | |
| } | |
| /************************************************************************** | |
| * WNetGetPropertyText [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 | |
| */ | |
| /********************************************************************* | |
| * WNetGetDirectoryType [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_NO_ROOT_DIR ) | |
| 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; | |
| } | |
| /************************************************************************** | |
| * WNetDirectoryNotify [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 | |
| */ | |
| /************************************************************************** | |
| * WNetGetError [USER.519] | |
| */ | |
| WORD WINAPI WNetGetError16( LPINT16 nError ) | |
| { | |
| FIXME( "(%p): stub\n", nError ); | |
| return WN16_NOT_SUPPORTED; | |
| } | |
| /************************************************************************** | |
| * WNetGetErrorText [USER.520] | |
| */ | |
| WORD WINAPI WNetGetErrorText16( WORD nError, LPSTR lpBuffer, LPINT16 nBufferSize ) | |
| { | |
| FIXME( "(%x, %p, %p): stub\n", nError, lpBuffer, nBufferSize ); | |
| return WN16_NET_ERROR; | |
| } | |
| /************************************************************************** | |
| * WNetErrorText [USER.499] | |
| */ | |
| WORD WINAPI WNetErrorText16( WORD nError, LPSTR lpszText, WORD cbText ) | |
| { | |
| FIXME("(%x, %p, %x): stub\n", nError, lpszText, cbText ); | |
| return FALSE; | |
| } |