set most of trunk svn property eol-style:native
[reactos.git] / reactos / dll / win32 / msgina / tui.c
1 /*
2 * PROJECT: ReactOS msgina.dll
3 * FILE: dll/win32/msgina/tui.c
4 * PURPOSE: ReactOS Logon GINA DLL
5 * PROGRAMMER: Hervé Poussineau (hpoussin@reactos.org)
6 */
7
8 #include "msgina.h"
9
10 #define YDEBUG
11 #include <wine/debug.h>
12
13 static BOOL
14 TUIInitialize(
15 IN OUT PGINA_CONTEXT pgContext)
16 {
17 TRACE("TUIInitialize(%p)\n", pgContext);
18
19 return AllocConsole();
20 }
21
22 static BOOL
23 TUIDisplayStatusMessage(
24 IN PGINA_CONTEXT pgContext,
25 IN HDESK hDesktop,
26 IN DWORD dwOptions,
27 IN PWSTR pTitle,
28 IN PWSTR pMessage)
29 {
30 static LPCWSTR newLine = L"\n";
31 DWORD result;
32
33 TRACE("TUIDisplayStatusMessage(%ws)\n", pMessage);
34
35 return
36 WriteConsoleW(
37 GetStdHandle(STD_OUTPUT_HANDLE),
38 pMessage,
39 wcslen(pMessage),
40 &result,
41 NULL) &&
42 WriteConsoleW(
43 GetStdHandle(STD_OUTPUT_HANDLE),
44 newLine,
45 wcslen(newLine),
46 &result,
47 NULL);
48 }
49
50 static BOOL
51 TUIRemoveStatusMessage(
52 IN PGINA_CONTEXT pgContext)
53 {
54 /* Nothing to do */
55 return TRUE;
56 }
57
58 static BOOL
59 DisplayResourceText(
60 IN UINT uIdResourceText,
61 IN BOOL AddNewLine)
62 {
63 WCHAR Prompt[256];
64 static LPCWSTR newLine = L"\n";
65 DWORD count;
66
67 if (!LoadStringW(hDllInstance, uIdResourceText, Prompt, 256))
68 return FALSE;
69 if (!WriteConsoleW(
70 GetStdHandle(STD_OUTPUT_HANDLE),
71 Prompt, wcslen(Prompt),
72 &count, NULL))
73 {
74 return FALSE;
75 }
76 if (AddNewLine)
77 {
78 if (!WriteConsoleW(
79 GetStdHandle(STD_OUTPUT_HANDLE),
80 newLine, wcslen(newLine),
81 &count, NULL))
82 {
83 return FALSE;
84 }
85 }
86 return TRUE;
87 }
88
89 static VOID
90 TUIDisplaySASNotice(
91 IN OUT PGINA_CONTEXT pgContext)
92 {
93 TRACE("TUIDisplaySASNotice()\n");
94
95 DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE);
96 DisplayResourceText(IDS_PRESSCTRLALTDELETE, TRUE);
97 }
98
99 static INT
100 TUILoggedOnSAS(
101 IN OUT PGINA_CONTEXT pgContext,
102 IN DWORD dwSasType)
103 {
104 TRACE("TUILoggedOnSAS()\n");
105
106 if (dwSasType != WLX_SAS_TYPE_CTRL_ALT_DEL)
107 {
108 /* Nothing to do for WLX_SAS_TYPE_TIMEOUT */
109 return WLX_SAS_ACTION_NONE;
110 }
111
112 FIXME("FIXME: TUILoggedOnSAS(): Let's suppose the user wants to log off...\n");
113 return WLX_SAS_ACTION_LOGOFF;
114 }
115
116 static BOOL
117 ReadString(
118 IN PGINA_CONTEXT pgContext,
119 IN UINT uIdResourcePrompt,
120 IN OUT PWSTR Buffer,
121 IN DWORD BufferLength,
122 IN BOOL ShowString)
123 {
124 DWORD count, i;
125 WCHAR charToDisplay[] = { 0, UNICODE_NULL };
126
127 if (!SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), 0))
128 return FALSE;
129
130 if (!FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)))
131 return FALSE;
132
133 if (!DisplayResourceText(uIdResourcePrompt, FALSE))
134 return FALSE;
135
136 i = 0;
137 for (;;)
138 {
139 WCHAR readChar;
140 if (!ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), &readChar, 1, &count, NULL))
141 return FALSE;
142 if (readChar == '\r' || readChar == '\n')
143 {
144 /* End of string */
145 charToDisplay[0] = L'\n';
146 WriteConsoleW(
147 GetStdHandle(STD_OUTPUT_HANDLE),
148 charToDisplay,
149 wcslen(charToDisplay),
150 &count,
151 NULL);
152 break;
153 }
154 if (ShowString)
155 {
156 /* Display the char */
157 charToDisplay[0] = readChar;
158 WriteConsoleW(
159 GetStdHandle(STD_OUTPUT_HANDLE),
160 charToDisplay,
161 wcslen(charToDisplay),
162 &count,
163 NULL);
164 }
165 Buffer[i++] = readChar;
166 /* FIXME: buffer overflow if the user writes too many chars! */
167 /* FIXME: handle backspace */
168 }
169 Buffer[i] = UNICODE_NULL;
170
171 if (!ShowString)
172 {
173 /* Still display the \n */
174 static LPCWSTR newLine = L"\n";
175 DWORD result;
176 WriteConsoleW(
177 GetStdHandle(STD_OUTPUT_HANDLE),
178 newLine,
179 wcslen(newLine),
180 &result,
181 NULL);
182 }
183 return TRUE;
184 }
185
186 static INT
187 TUILoggedOutSAS(
188 IN OUT PGINA_CONTEXT pgContext)
189 {
190 WCHAR UserName[256];
191 WCHAR Password[256];
192
193 TRACE("TUILoggedOutSAS()\n");
194
195 /* Ask the user for credentials */
196 if (!ReadString(pgContext, IDS_ASKFORUSER, UserName, 256, TRUE))
197 return WLX_SAS_ACTION_NONE;
198 if (!ReadString(pgContext, IDS_ASKFORPASSWORD, Password, 256, FALSE))
199 return WLX_SAS_ACTION_NONE;
200
201 if (DoLoginTasks(pgContext, UserName, NULL, Password))
202 return WLX_SAS_ACTION_LOGON;
203 else
204 return WLX_SAS_ACTION_NONE;
205 }
206
207 static INT
208 TUILockedSAS(
209 IN OUT PGINA_CONTEXT pgContext)
210 {
211 WCHAR UserName[256];
212 WCHAR Password[256];
213
214 TRACE("TUILockedSAS()\n");
215
216 if (!DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE))
217 return WLX_SAS_ACTION_UNLOCK_WKSTA;
218
219 /* Ask the user for credentials */
220 if (!ReadString(pgContext, IDS_ASKFORUSER, UserName, 256, TRUE))
221 return WLX_SAS_ACTION_NONE;
222 if (!ReadString(pgContext, IDS_ASKFORPASSWORD, Password, 256, FALSE))
223 return WLX_SAS_ACTION_NONE;
224
225 FIXME("FIXME: Check user/password\n");
226 return WLX_SAS_ACTION_UNLOCK_WKSTA;
227 }
228
229 GINA_UI GinaTextUI = {
230 TUIInitialize,
231 TUIDisplayStatusMessage,
232 TUIRemoveStatusMessage,
233 TUIDisplaySASNotice,
234 TUILoggedOnSAS,
235 TUILoggedOutSAS,
236 TUILockedSAS,
237 };