A generic implemention of IConnectionPoint/IEnumConnections.
[wine] / dlls / mpr / wnet.c
1 /*
2  * MPR WNet functions
3  */
4
5 #include <ctype.h>
6 #include <string.h>
7 #include <sys/types.h>
8 #include <pwd.h>
9 #include <unistd.h>
10
11 #include "winbase.h"
12 #include "winnetwk.h"
13 #include "drive.h"
14 #include "heap.h"
15 #include "debugtools.h"
16
17 DEFAULT_DEBUG_CHANNEL(mpr)
18
19
20 /*
21  * Browsing Functions
22  */
23
24 /*********************************************************************
25  * WNetOpenEnumA [MPR.92]
26  */
27 DWORD WINAPI WNetOpenEnumA( DWORD dwScope, DWORD dwType, DWORD dwUsage,
28                             LPNETRESOURCEA lpNet, LPHANDLE lphEnum )
29 {
30     FIXME( "(%08lX, %08lX, %08lX, %p, %p): stub\n",
31             dwScope, dwType, dwUsage, lpNet, lphEnum );
32
33     SetLastError(WN_NO_NETWORK);
34     return WN_NO_NETWORK;
35 }
36
37 /*********************************************************************
38  * WNetOpenEnumW [MPR.93]
39  */
40 DWORD WINAPI WNetOpenEnumW( DWORD dwScope, DWORD dwType, DWORD dwUsage,
41                             LPNETRESOURCEW lpNet, LPHANDLE lphEnum )
42 {
43    FIXME( "(%08lX, %08lX, %08lX, %p, %p): stub\n",
44           dwScope, dwType, dwUsage, lpNet, lphEnum );
45
46    SetLastError(WN_NO_NETWORK);
47    return WN_NO_NETWORK;
48 }
49
50 /*********************************************************************
51  * WNetEnumResourceA [MPR.66]
52  */
53 DWORD WINAPI WNetEnumResourceA( HANDLE hEnum, LPDWORD lpcCount, 
54                                 LPVOID lpBuffer, LPDWORD lpBufferSize )
55 {
56     FIXME( "(%04X, %p, %p, %p): stub\n", 
57             hEnum, lpcCount, lpBuffer, lpBufferSize );
58
59     SetLastError(WN_NO_NETWORK);
60     return WN_NO_NETWORK;
61 }
62
63 /*********************************************************************
64  * WNetEnumResourceW [MPR.67]
65  */
66 DWORD WINAPI WNetEnumResourceW( HANDLE hEnum, LPDWORD lpcCount, 
67                                 LPVOID lpBuffer, LPDWORD lpBufferSize )
68 {
69     FIXME( "(%04X, %p, %p, %p): stub\n", 
70             hEnum, lpcCount, lpBuffer, lpBufferSize );
71
72     SetLastError(WN_NO_NETWORK);
73     return WN_NO_NETWORK;
74 }
75
76 /*********************************************************************
77  * WNetCloseEnum [MPR.58]
78  */
79 DWORD WINAPI WNetCloseEnum( HANDLE hEnum )
80 {
81     FIXME( "(%04X): stub\n", hEnum );
82
83     SetLastError(WN_NO_NETWORK);
84     return WN_NO_NETWORK;
85 }
86
87 /*********************************************************************
88  * WNetGetResourceInformationA [MPR.80]
89  */
90 DWORD WINAPI WNetGetResourceInformationA( LPNETRESOURCEA lpNetResource, 
91                                           LPVOID lpBuffer, LPDWORD cbBuffer, 
92                                           LPSTR *lplpSystem )
93 {
94     FIXME( "(%p, %p, %p, %p): stub\n",
95            lpNetResource, lpBuffer, cbBuffer, lplpSystem );
96
97     SetLastError(WN_NO_NETWORK);
98     return WN_NO_NETWORK;
99 }
100
101 /*********************************************************************
102  * WNetGetResourceInformationW [MPR.80]
103  */
104 DWORD WINAPI WNetGetResourceInformationW( LPNETRESOURCEW lpNetResource, 
105                                           LPVOID lpBuffer, LPDWORD cbBuffer, 
106                                           LPWSTR *lplpSystem )
107 {
108     FIXME( "(%p, %p, %p, %p): stub\n",
109            lpNetResource, lpBuffer, cbBuffer, lplpSystem );
110
111     SetLastError(WN_NO_NETWORK);
112     return WN_NO_NETWORK;
113 }
114
115 /*********************************************************************
116  * WNetGetResourceParentA [MPR.83]
117  */
118 DWORD WINAPI WNetGetResourceParentA( LPNETRESOURCEA lpNetResource,
119                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
120 {
121     FIXME( "(%p, %p, %p): stub\n", 
122            lpNetResource, lpBuffer, lpBufferSize );
123
124     SetLastError(WN_NO_NETWORK);
125     return WN_NO_NETWORK;
126 }
127
128 /*********************************************************************
129  * WNetGetResourceParentW [MPR.84]
130  */
131 DWORD WINAPI WNetGetResourceParentW( LPNETRESOURCEW lpNetResource,
132                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
133 {
134     FIXME( "(%p, %p, %p): stub\n", 
135            lpNetResource, lpBuffer, lpBufferSize );
136
137     SetLastError(WN_NO_NETWORK);
138     return WN_NO_NETWORK;
139 }
140
141
142
143 /*
144  * Connection Functions
145  */
146
147 /*********************************************************************
148  *  WNetAddConnectionA [MPR.50] 
149  */
150 DWORD WINAPI WNetAddConnectionA( LPCSTR lpRemoteName, LPCSTR lpPassword,
151                                  LPCSTR lpLocalName )
152 {
153     FIXME( "(%s, %p, %s): stub\n", 
154            debugstr_a(lpRemoteName), lpPassword, debugstr_a(lpLocalName) );
155
156     SetLastError(WN_NO_NETWORK);
157     return WN_NO_NETWORK;
158 }
159
160 /*********************************************************************
161  *  WNetAddConnectionW [MPR.51] 
162  */
163 DWORD WINAPI WNetAddConnectionW( LPCWSTR lpRemoteName, LPCWSTR lpPassword,
164                                  LPCWSTR lpLocalName )
165 {
166     FIXME( "(%s, %p, %s): stub\n", 
167            debugstr_w(lpRemoteName), lpPassword, debugstr_w(lpLocalName) );
168
169     SetLastError(WN_NO_NETWORK);
170     return WN_NO_NETWORK;
171 }
172
173 /*********************************************************************
174  *  WNetAddConnection2A [MPR.46] 
175  */
176 DWORD WINAPI WNetAddConnection2A( LPNETRESOURCEA lpNetResource,
177                                   LPCSTR lpPassword, LPCSTR lpUserID, 
178                                   DWORD dwFlags )
179 {
180     FIXME( "(%p, %p, %s, 0x%08lX): stub\n", 
181            lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags );
182
183     SetLastError(WN_NO_NETWORK);
184     return WN_NO_NETWORK;
185 }
186
187 /*********************************************************************
188  * WNetAddConnection2W [MPR.47]
189  */
190 DWORD WINAPI WNetAddConnection2W( LPNETRESOURCEW lpNetResource,
191                                   LPCWSTR lpPassword, LPCWSTR lpUserID, 
192                                   DWORD dwFlags )
193 {
194     FIXME( "(%p, %p, %s, 0x%08lX): stub\n", 
195            lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags );
196
197     SetLastError(WN_NO_NETWORK);
198     return WN_NO_NETWORK;
199 }
200
201 /*********************************************************************
202  * WNetAddConnection3A [MPR.48]
203  */
204 DWORD WINAPI WNetAddConnection3A( HWND hwndOwner, LPNETRESOURCEA lpNetResource,
205                                   LPCSTR lpPassword, LPCSTR lpUserID, 
206                                   DWORD dwFlags )
207 {
208     FIXME( "(%04x, %p, %p, %s, 0x%08lX), stub\n", 
209            hwndOwner, lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags );
210
211     SetLastError(WN_NO_NETWORK);
212     return WN_NO_NETWORK;
213 }
214
215 /*********************************************************************
216  * WNetAddConnection3W [MPR.49]
217  */
218 DWORD WINAPI WNetAddConnection3W( HWND hwndOwner, LPNETRESOURCEW lpNetResource,
219                                   LPCWSTR lpPassword, LPCWSTR lpUserID, 
220                                   DWORD dwFlags )
221 {
222     FIXME( "(%04x, %p, %p, %s, 0x%08lX), stub\n", 
223            hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags );
224
225     SetLastError(WN_NO_NETWORK);
226     return WN_NO_NETWORK;
227
228
229 /*****************************************************************
230  *  WNetUseConnectionA [MPR.100]
231  */
232 DWORD WINAPI WNetUseConnectionA( HWND hwndOwner, LPNETRESOURCEA lpNetResource,
233                                  LPCSTR lpPassword, LPCSTR lpUserID, DWORD dwFlags,
234                                  LPSTR lpAccessName, LPDWORD lpBufferSize, 
235                                  LPDWORD lpResult )
236 {
237     FIXME( "(%04x, %p, %p, %s, 0x%08lX, %s, %p, %p), stub\n", 
238            hwndOwner, lpNetResource, lpPassword, debugstr_a(lpUserID), dwFlags,
239            debugstr_a(lpAccessName), lpBufferSize, lpResult );
240
241     SetLastError(WN_NO_NETWORK);
242     return WN_NO_NETWORK;
243 }
244
245 /*****************************************************************
246  *  WNetUseConnectionW [MPR.101]
247  */
248 DWORD WINAPI WNetUseConnectionW( HWND hwndOwner, LPNETRESOURCEW lpNetResource,
249                                  LPCWSTR lpPassword, LPCWSTR lpUserID, DWORD dwFlags,
250                                  LPWSTR lpAccessName, LPDWORD lpBufferSize,
251                                  LPDWORD lpResult )
252 {
253     FIXME( "(%04x, %p, %p, %s, 0x%08lX, %s, %p, %p), stub\n", 
254            hwndOwner, lpNetResource, lpPassword, debugstr_w(lpUserID), dwFlags,
255            debugstr_w(lpAccessName), lpBufferSize, lpResult );
256
257     SetLastError(WN_NO_NETWORK);
258     return WN_NO_NETWORK;
259 }
260
261 /*********************************************************************
262  *  WNetCancelConnectionA [MPR.55]
263  */
264 DWORD WINAPI WNetCancelConnectionA( LPCSTR lpName, BOOL fForce )
265 {
266     FIXME( "(%s, %d), stub\n", debugstr_a(lpName), fForce );
267
268     return WN_SUCCESS;
269 }
270
271 /*********************************************************************
272  *  WNetCancelConnectionW [MPR.56]
273  */
274 DWORD WINAPI WNetCancelConnectionW( LPCWSTR lpName, BOOL fForce ) 
275 {
276     FIXME( "(%s, %d), stub\n", debugstr_w(lpName), fForce );
277
278     return WN_SUCCESS;
279 }
280
281 /*********************************************************************
282  *  WNetCancelConnection2A [MPR.53]
283  */
284 DWORD WINAPI WNetCancelConnection2A( LPCSTR lpName, DWORD dwFlags, BOOL fForce ) 
285 {
286     FIXME( "(%s, %08lX, %d), stub\n", debugstr_a(lpName), dwFlags, fForce );
287
288     return WN_SUCCESS;
289 }
290
291 /*********************************************************************
292  *  WNetCancelConnection2W [MPR.54]
293  */
294 DWORD WINAPI WNetCancelConnection2W( LPCWSTR lpName, DWORD dwFlags, BOOL fForce ) 
295 {
296     FIXME( "(%s, %08lX, %d), stub\n", debugstr_w(lpName), dwFlags, fForce );
297
298     return WN_SUCCESS;
299 }
300
301 /*****************************************************************
302  *  WNetRestoreConnectionA [MPR.96]
303  */
304 DWORD WINAPI WNetRestoreConnectionA( HWND hwndOwner, LPSTR lpszDevice )
305 {
306     FIXME( "(%04X, %s), stub\n", hwndOwner, debugstr_a(lpszDevice) );
307
308     SetLastError(WN_NO_NETWORK);
309     return WN_NO_NETWORK;
310 }
311
312 /*****************************************************************
313  *  WNetRestoreConnectionW [MPR.97]
314  */
315 DWORD WINAPI WNetRestoreConnectionW( HWND hwndOwner, LPWSTR lpszDevice )
316 {
317     FIXME( "(%04X, %s), stub\n", hwndOwner, debugstr_w(lpszDevice) );
318
319     SetLastError(WN_NO_NETWORK);
320     return WN_NO_NETWORK;
321 }
322
323 /**************************************************************************
324  * WNetGetConnectionA [MPR.71]
325  *
326  * RETURNS
327  * - WN_BAD_LOCALNAME     lpLocalName makes no sense
328  * - WN_NOT_CONNECTED     drive is a local drive
329  * - WN_MORE_DATA         buffer isn't big enough
330  * - WN_SUCCESS           success (net path in buffer)  
331  *
332  */
333 DWORD WINAPI WNetGetConnectionA( LPCSTR lpLocalName, 
334                                  LPSTR lpRemoteName, LPDWORD lpBufferSize )
335 {
336     const char *path;
337
338     TRACE( "local %s\n", lpLocalName );
339     if (lpLocalName[1] == ':')
340     {
341         int drive = toupper(lpLocalName[0]) - 'A';
342         switch(DRIVE_GetType(drive))
343         {
344         case TYPE_INVALID:
345             return WN_BAD_LOCALNAME;
346         case TYPE_NETWORK:
347             path = DRIVE_GetLabel(drive);
348             if (strlen(path) + 1 > *lpBufferSize)
349             {
350                 *lpBufferSize = strlen(path) + 1;
351                 return WN_MORE_DATA;
352             }
353             strcpy( lpRemoteName, path );
354             *lpBufferSize = strlen(lpRemoteName) + 1;
355             return WN_SUCCESS;
356         case TYPE_FLOPPY:
357         case TYPE_HD:
358         case TYPE_CDROM:
359           TRACE("file is local\n");
360           return WN_NOT_CONNECTED;
361         default:
362             return WN_BAD_LOCALNAME;
363         }
364     }
365     return WN_BAD_LOCALNAME;
366 }
367
368 /**************************************************************************
369  * WNetGetConnectionW [MPR.72]
370  */
371 DWORD WINAPI WNetGetConnectionW( LPCWSTR lpLocalName, 
372                                  LPWSTR lpRemoteName, LPDWORD lpBufferSize )
373 {
374     DWORD x;
375     CHAR  buf[200];
376     LPSTR lnA = HEAP_strdupWtoA( GetProcessHeap(), 0, lpLocalName );
377     DWORD ret = WNetGetConnectionA( lnA, buf, &x );
378
379     lstrcpyAtoW( lpRemoteName, buf );
380     *lpBufferSize=lstrlenW( lpRemoteName );
381     HeapFree( GetProcessHeap(), 0, lnA );
382     return ret;
383 }
384
385 /**************************************************************************
386  * WNetSetConnectionA [MPR.72]
387  */
388 DWORD WINAPI WNetSetConnectionA( LPCSTR lpName, DWORD dwProperty, 
389                                  LPVOID pvValue )
390 {
391     FIXME( "(%s, %08lX, %p): stub\n", debugstr_a(lpName), dwProperty, pvValue );
392
393     SetLastError(WN_NO_NETWORK);
394     return WN_NO_NETWORK;
395 }
396
397 /**************************************************************************
398  * WNetSetConnectionW [MPR.72]
399  */
400 DWORD WINAPI WNetSetConnectionW( LPCWSTR lpName, DWORD dwProperty, 
401                                  LPVOID pvValue )
402 {
403     FIXME( "(%s, %08lX, %p): stub\n", debugstr_w(lpName), dwProperty, pvValue );
404
405     SetLastError(WN_NO_NETWORK);
406     return WN_NO_NETWORK;
407 }
408
409 /*****************************************************************
410  * WNetGetUniversalNameA [MPR.85]
411  */
412 DWORD WINAPI WNetGetUniversalNameA ( LPCSTR lpLocalPath, DWORD dwInfoLevel, 
413                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
414 {
415     FIXME( "(%s, 0x%08lX, %p, %p): stub\n", 
416            debugstr_a(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
417
418     SetLastError(WN_NO_NETWORK);
419     return WN_NO_NETWORK;
420 }
421
422 /*****************************************************************
423  * WNetGetUniversalNameW [MPR.86]
424  */
425 DWORD WINAPI WNetGetUniversalNameW ( LPCWSTR lpLocalPath, DWORD dwInfoLevel, 
426                                      LPVOID lpBuffer, LPDWORD lpBufferSize )
427 {
428     FIXME( "(%s, 0x%08lX, %p, %p): stub\n", 
429            debugstr_w(lpLocalPath), dwInfoLevel, lpBuffer, lpBufferSize);
430
431     SetLastError(WN_NO_NETWORK);
432     return WN_NO_NETWORK;
433 }
434
435
436
437 /*
438  * Other Functions
439  */
440
441 /**************************************************************************
442  * WNetGetUserA [MPR.86]
443  *
444  * FIXME: we should not return ourselves, but the owner of the drive lpName
445  */
446 DWORD WINAPI WNetGetUserA( LPCSTR lpName, LPSTR lpUserID, LPDWORD lpBufferSize )
447 {
448     struct passwd *pwd = getpwuid(getuid());
449
450     FIXME( "(%s, %p, %p): mostly stub\n", 
451            debugstr_a(lpName), lpUserID, lpBufferSize );
452
453     if (pwd)
454     {
455         if ( strlen(pwd->pw_name) + 1 > *lpBufferSize )
456         {
457             *lpBufferSize = strlen(pwd->pw_name) + 1;
458
459             SetLastError(ERROR_MORE_DATA);
460             return ERROR_MORE_DATA;
461         }
462
463         strcpy( lpUserID, pwd->pw_name );
464         *lpBufferSize = strlen(pwd->pw_name) + 1;
465         return WN_SUCCESS;
466     }
467
468     /* FIXME: wrong return value */
469     SetLastError(ERROR_NO_NETWORK);
470     return ERROR_NO_NETWORK;
471 }
472
473 /*****************************************************************
474  * WNetGetUserW [MPR.87]
475  */
476 DWORD WINAPI WNetGetUserW( LPCWSTR lpName, LPWSTR lpUserID, LPDWORD lpBufferSize ) 
477 {
478     FIXME( "(%s, %p, %p): mostly stub\n", 
479            debugstr_w(lpName), lpUserID, lpBufferSize );
480
481     SetLastError(WN_NO_NETWORK);
482     return WN_NO_NETWORK;
483 }
484
485 /*********************************************************************
486  * WNetConnectionDialog [MPR.61]
487  */ 
488 DWORD WINAPI WNetConnectionDialog( HWND hwnd, DWORD dwType )
489
490     FIXME( "(%04x, %08lX): stub\n", hwnd, dwType );
491
492     SetLastError(WN_NO_NETWORK);
493     return ERROR_NO_NETWORK;
494 }
495
496 /*********************************************************************
497  * WNetConnectionDialog1A [MPR.59]
498  */
499 DWORD WINAPI WNetConnectionDialog1A( LPCONNECTDLGSTRUCTA lpConnDlgStruct )
500
501     FIXME( "(%p): stub\n", lpConnDlgStruct );
502
503     SetLastError(WN_NO_NETWORK);
504     return ERROR_NO_NETWORK;
505 }
506
507 /*********************************************************************
508  * WNetConnectionDialog1W [MPR.60]
509  */ 
510 DWORD WINAPI WNetConnectionDialog1W( LPCONNECTDLGSTRUCTW lpConnDlgStruct )
511
512     FIXME( "(%p): stub\n", lpConnDlgStruct );
513
514     SetLastError(WN_NO_NETWORK);
515     return ERROR_NO_NETWORK;
516 }
517
518 /*********************************************************************
519  * WNetDisconnectDialog [MPR.64]
520  */ 
521 DWORD WINAPI WNetDisconnectDialog( HWND hwnd, DWORD dwType )
522
523     FIXME( "(%04x, %08lX): stub\n", hwnd, dwType );
524
525     SetLastError(WN_NO_NETWORK);
526     return ERROR_NO_NETWORK;
527 }
528
529 /*********************************************************************
530  * WNetDisconnectDialog1A [MPR.62]
531  */ 
532 DWORD WINAPI WNetDisconnectDialog1A( LPDISCDLGSTRUCTA lpConnDlgStruct )
533
534     FIXME( "(%p): stub\n", lpConnDlgStruct );
535
536     SetLastError(WN_NO_NETWORK);
537     return ERROR_NO_NETWORK;
538 }
539
540 /*********************************************************************
541  * WNetDisconnectDialog1W [MPR.63]
542  */ 
543 DWORD WINAPI WNetDisconnectDialog1W( LPDISCDLGSTRUCTW lpConnDlgStruct )
544
545     FIXME( "(%p): stub\n", lpConnDlgStruct );
546
547     SetLastError(WN_NO_NETWORK);
548     return ERROR_NO_NETWORK;
549 }
550
551 /*********************************************************************
552  * WNetGetLastErrorA [MPR.75]
553  */ 
554 DWORD WINAPI WNetGetLastErrorA( LPDWORD lpError,
555                                 LPSTR lpErrorBuf, DWORD nErrorBufSize,
556                                 LPSTR lpNameBuf, DWORD nNameBufSize )
557 {
558     FIXME( "(%p, %p, %ld, %p, %ld): stub\n", 
559            lpError, lpErrorBuf, nErrorBufSize, lpNameBuf, nNameBufSize );
560
561     SetLastError(WN_NO_NETWORK);
562     return ERROR_NO_NETWORK;
563 }
564
565 /*********************************************************************
566  * WNetGetLastErrorW [MPR.76]
567  */ 
568 DWORD WINAPI WNetGetLastErrorW( LPDWORD lpError,
569                                 LPWSTR lpErrorBuf, DWORD nErrorBufSize,
570                          LPWSTR lpNameBuf, DWORD nNameBufSize )
571 {
572     FIXME( "(%p, %p, %ld, %p, %ld): stub\n", 
573            lpError, lpErrorBuf, nErrorBufSize, lpNameBuf, nNameBufSize );
574
575     SetLastError(WN_NO_NETWORK);
576     return ERROR_NO_NETWORK;
577 }
578
579 /*********************************************************************
580  * WNetGetNetworkInformationA [MPR.77]
581  */ 
582 DWORD WINAPI WNetGetNetworkInformationA( LPCSTR lpProvider, 
583                                          LPNETINFOSTRUCT lpNetInfoStruct )
584 {
585     FIXME( "(%s, %p): stub\n", debugstr_a(lpProvider), lpNetInfoStruct );
586
587     SetLastError(WN_NO_NETWORK);
588     return ERROR_NO_NETWORK;
589 }
590
591 /*********************************************************************
592  * WNetGetNetworkInformationW [MPR.77]
593  */ 
594 DWORD WINAPI WNetGetNetworkInformationW( LPCWSTR lpProvider, 
595                                          LPNETINFOSTRUCT lpNetInfoStruct )
596 {
597     FIXME( "(%s, %p): stub\n", debugstr_w(lpProvider), lpNetInfoStruct );
598
599     SetLastError(WN_NO_NETWORK);
600     return ERROR_NO_NETWORK;
601 }
602
603 /*****************************************************************
604  *  WNetGetProviderNameA [MPR.79]
605  */
606 DWORD WINAPI WNetGetProviderNameA( DWORD dwNetType, 
607                                    LPSTR lpProvider, LPDWORD lpBufferSize )
608 {
609     FIXME( "(%ld, %p, %p): stub\n", dwNetType, lpProvider, lpBufferSize );
610
611     SetLastError(WN_NO_NETWORK);
612     return WN_NO_NETWORK;
613 }
614
615 /*****************************************************************
616  *  WNetGetProviderNameW [MPR.80]
617  */
618 DWORD WINAPI WNetGetProviderNameW( DWORD dwNetType,
619                                    LPWSTR lpProvider, LPDWORD lpBufferSize ) 
620 {
621     FIXME( "(%ld, %p, %p): stub\n", dwNetType, lpProvider, lpBufferSize );
622
623     SetLastError(WN_NO_NETWORK);
624     return WN_NO_NETWORK;
625 }
626