[NET]
[reactos.git] / reactos / base / applications / network / net / main.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS net command
4 * FILE:
5 * PURPOSE:
6 *
7 * PROGRAMMERS: Magnus Olsen (greatlord@reactos.org)
8 */
9
10 #include "net.h"
11
12 #define MAX_BUFFER_SIZE 4096
13
14 typedef struct _COMMAND
15 {
16 WCHAR *name;
17 INT (*func)(INT, WCHAR**);
18 // VOID (*help)(INT, WCHAR**);
19 } COMMAND, *PCOMMAND;
20
21 COMMAND cmds[] =
22 {
23 {L"accounts", cmdAccounts},
24 {L"computer", unimplemented},
25 {L"config", unimplemented},
26 {L"continue", cmdContinue},
27 {L"file", unimplemented},
28 {L"group", unimplemented},
29 {L"help", cmdHelp},
30 {L"helpmsg", cmdHelpMsg},
31 {L"localgroup", cmdLocalGroup},
32 {L"name", unimplemented},
33 {L"pause", cmdPause},
34 {L"print", unimplemented},
35 {L"send", unimplemented},
36 {L"session", unimplemented},
37 {L"share", unimplemented},
38 {L"start", cmdStart},
39 {L"statistics", unimplemented},
40 {L"stop", cmdStop},
41 {L"time", unimplemented},
42 {L"use", unimplemented},
43 {L"user", cmdUser},
44 {L"view", unimplemented},
45 {NULL, NULL}
46 };
47
48
49 VOID
50 PrintResourceString(
51 INT resID,
52 ...)
53 {
54 WCHAR szMsgBuffer[MAX_BUFFER_SIZE];
55 WCHAR szOutBuffer[MAX_BUFFER_SIZE];
56 va_list arg_ptr;
57
58 va_start(arg_ptr, resID);
59 LoadStringW(GetModuleHandle(NULL), resID, szMsgBuffer, MAX_BUFFER_SIZE);
60 _vsnwprintf(szOutBuffer, MAX_BUFFER_SIZE, szMsgBuffer, arg_ptr);
61 va_end(arg_ptr);
62
63 WriteToConsole(szOutBuffer);
64 }
65
66
67 VOID
68 PrintToConsole(
69 LPWSTR lpFormat,
70 ...)
71 {
72 WCHAR szBuffer[MAX_BUFFER_SIZE];
73 va_list arg_ptr;
74
75 va_start(arg_ptr, lpFormat);
76 _vsnwprintf(szBuffer, MAX_BUFFER_SIZE, lpFormat, arg_ptr);
77 va_end(arg_ptr);
78
79 WriteToConsole(szBuffer);
80 }
81
82
83 VOID
84 WriteToConsole(
85 LPWSTR lpString)
86 {
87 CHAR szOemBuffer[MAX_BUFFER_SIZE * 2];
88 HANDLE hOutput;
89 DWORD dwLength;
90
91 dwLength = wcslen(lpString);
92
93 hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
94 if ((GetFileType(hOutput) & ~FILE_TYPE_REMOTE) == FILE_TYPE_CHAR)
95 {
96 WriteConsoleW(hOutput,
97 lpString,
98 dwLength,
99 &dwLength,
100 NULL);
101 }
102 else
103 {
104 dwLength = WideCharToMultiByte(CP_OEMCP,
105 0,
106 lpString,
107 dwLength,
108 szOemBuffer,
109 MAX_BUFFER_SIZE * 2,
110 NULL,
111 NULL);
112 WriteFile(hOutput,
113 szOemBuffer,
114 dwLength,
115 &dwLength,
116 NULL);
117 }
118 }
119
120
121 VOID
122 ReadFromConsole(
123 LPWSTR lpInput,
124 DWORD dwLength,
125 BOOL bEcho)
126 {
127 DWORD dwOldMode;
128 DWORD dwRead = 0;
129 HANDLE hFile;
130 LPWSTR p;
131 PCHAR pBuf;
132
133 pBuf = HeapAlloc(GetProcessHeap(), 0, dwLength - 1);
134 ZeroMemory(lpInput, dwLength * sizeof(WCHAR));
135 hFile = GetStdHandle(STD_INPUT_HANDLE);
136 GetConsoleMode(hFile, &dwOldMode);
137
138 SetConsoleMode(hFile, ENABLE_LINE_INPUT | (bEcho ? ENABLE_ECHO_INPUT : 0));
139
140 ReadFile(hFile, (PVOID)pBuf, dwLength - 1, &dwRead, NULL);
141
142 MultiByteToWideChar(CP_OEMCP, 0, pBuf, dwRead, lpInput, dwLength - 1);
143 HeapFree(GetProcessHeap(), 0, pBuf);
144
145 for (p = lpInput; *p; p++)
146 {
147 if (*p == L'\x0d')
148 {
149 *p = L'\0';
150 break;
151 }
152 }
153
154 SetConsoleMode(hFile, dwOldMode);
155 }
156
157
158 int wmain(int argc, WCHAR **argv)
159 {
160 PCOMMAND cmdptr;
161
162 if (argc < 2)
163 {
164 PrintResourceString(IDS_NET_SYNTAX);
165 return 1;
166 }
167
168 /* Scan the command table */
169 for (cmdptr = cmds; cmdptr->name; cmdptr++)
170 {
171 if (_wcsicmp(argv[1], cmdptr->name) == 0)
172 {
173 return cmdptr->func(argc, argv);
174 }
175 }
176
177 PrintResourceString(IDS_NET_SYNTAX);
178
179 return 1;
180 }
181
182 INT unimplemented(INT argc, WCHAR **argv)
183 {
184 puts("This command is not implemented yet");
185 return 1;
186 }