[FONTSUB] Fix buildĀ²
[reactos.git] / modules / rosapps / applications / sysutils / regexpl / RegistryExplorer.cpp
1 /*
2 * regexpl - Console Registry Explorer
3 *
4 * Copyright (C) 2000-2005 Nedko Arnaudov <nedko@users.sourceforge.net>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; see the file COPYING. If not, write to
18 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
20 */
21
22 // RegistryExplorer.cpp : Defines the entry point for the Regiistry Explorer.
23 //
24
25 #include "ph.h"
26 #include "RegistryExplorer.h"
27 #include "Console.h"
28 #include "RegistryKey.h"
29 #include "RegistryTree.h"
30 #include "SecurityDescriptor.h"
31 #include "ArgumentParser.h"
32 #include "ShellCommandsLinkedList.h"
33 #include "ShellCommandExit.h"
34 #include "ShellCommandVersion.h"
35 #include "ShellCommandHelp.h"
36 #include "ShellCommandDir.h"
37 #include "ShellCommandChangeKey.h"
38 #include "ShellCommandValue.h"
39 #include "ShellCommandOwner.h"
40 #include "ShellCommandDACL.h"
41 #include "ShellCommandSACL.h"
42 //#include "ShellCommandDOKA.h"
43 #include "ShellCommandConnect.h"
44 #include "ShellCommandNewKey.h"
45 #include "ShellCommandDeleteKey.h"
46 #include "ShellCommandSetValue.h"
47 #include "ShellCommandDeleteValue.h"
48 #include "Prompt.h"
49 #include "Settings.h"
50
51 TCHAR pchCurrentKey[PROMPT_BUFFER_SIZE];
52
53 CRegistryTree Tree;
54 CConsole Console;
55
56 BOOL blnCommandExecutionInProgress = FALSE;
57
58 BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
59 {
60 switch(dwCtrlType)
61 {
62 case CTRL_C_EVENT:
63 case CTRL_BREAK_EVENT:
64 if (blnCommandExecutionInProgress)
65 {
66 /* Beep(1000,100);
67 Beep(2000,100);
68 Beep(3000,100);
69 Beep(4000,100);
70 Beep(5000,100);
71 Beep(4000,100);
72 Beep(3000,100);
73 Beep(2000,100);
74 Beep(1000,100);*/
75 Console.Write(_T("\n"));
76 Console.DisableWrite();
77 }
78 return TRUE;
79 default:
80 return FALSE;
81 }
82 }
83
84 //int _tmain(/*int argc, TCHAR* argv[], TCHAR* envp[]*/)
85 int main ()
86 {
87 int nRetCode = 0;
88
89 HRESULT hr;
90
91 CSettings *pSettings = NULL;
92 CPrompt *pPrompt = NULL;
93
94 CShellCommandsLinkedList CommandsList(Console);
95
96 CShellCommandExit ExitCommand;
97 CommandsList.AddCommand(&ExitCommand);
98
99 CShellCommandVersion VersionCommand;
100 CommandsList.AddCommand(&VersionCommand);
101
102 CShellCommandHelp HelpCommand(CommandsList);
103 CommandsList.AddCommand(&HelpCommand);
104
105 CShellCommandDir DirCommand(Tree);
106 CommandsList.AddCommand(&DirCommand);
107
108 CShellCommandChangeKey ChangeKeyCommand(Tree);
109 CommandsList.AddCommand(&ChangeKeyCommand);
110
111 CShellCommandValue ValueCommand(Tree);
112 CommandsList.AddCommand(&ValueCommand);
113
114 CShellCommandOwner OwnerCommand(Tree);
115 CommandsList.AddCommand(&OwnerCommand);
116
117 CShellCommandDACL DACLCommand(Tree);
118 CommandsList.AddCommand(&DACLCommand);
119
120 CShellCommandSACL SACLCommand(Tree);
121 CommandsList.AddCommand(&SACLCommand);
122
123 CShellCommandConnect ConnectCommand(Tree);
124 CommandsList.AddCommand(&ConnectCommand);
125
126 CShellCommandNewKey NewKeyCommand(Tree);
127 CommandsList.AddCommand(&NewKeyCommand);
128
129 CShellCommandDeleteKey DeleteKeyCommand(Tree);
130 CommandsList.AddCommand(&DeleteKeyCommand);
131
132 CShellCommandSetValue SetValueCommand(Tree);
133 CommandsList.AddCommand(&SetValueCommand);
134
135 CShellCommandDeleteValue DeleteValueCommand(Tree);
136 CommandsList.AddCommand(&DeleteValueCommand);
137
138 CArgumentParser Parser;
139
140 pSettings = new (std::nothrow) CSettings();
141 if (!pSettings)
142 {
143 _ftprintf(stderr,_T("Cannot initialize settings. Out of memory.\n"));
144 goto Abort;
145 }
146
147 hr = pSettings->Load(SETTINGS_REGISTRY_KEY);
148 if (FAILED(hr))
149 {
150 _ftprintf(stderr,_T("Cannot load settings. Error is 0x%X.\n"),(unsigned int)hr);
151 goto Abort;
152 }
153
154 pPrompt = new (std::nothrow) CPrompt(Tree,hr);
155 if (!pPrompt)
156 {
157 _ftprintf(stderr,_T("Cannot initialize prompt. Out of memory.\n"));
158 goto Abort;
159 }
160
161 if (FAILED(hr))
162 {
163 _ftprintf(stderr,_T("Cannot initialize prompt. Error is 0x%X.\n"),(unsigned int)hr);
164 goto Abort;
165 }
166
167 // input buffer size in chars
168 #define INPUT_BUFFER_SIZE 1024
169 //#define INPUT_BUFFER_SIZE 128
170 //#define INPUT_BUFFER_SIZE 10
171
172 TCHAR *pchCommand;
173
174 pchCommand = Console.Init(INPUT_BUFFER_SIZE,10);
175 if (pchCommand == NULL)
176 {
177 _ftprintf(stderr,_T("Cannot initialize console.\n"));
178 nRetCode = 1;
179 goto Exit;
180 }
181
182 Console.SetReplaceCompletionCallback(CompletionCallback);
183
184 WORD wOldConsoleAttribute;
185 if (!Console.GetTextAttribute(wOldConsoleAttribute)) goto Abort;
186
187 Console.SetTitle(_T("Registry Explorer"));
188 Console.SetTextAttribute(pSettings->GetNormalTextAttributes());
189
190 VERIFY(SetConsoleCtrlHandler((PHANDLER_ROUTINE)HandlerRoutine,TRUE));
191
192 if (!Console.Write(HELLO_MSG
193 //(_L(__TIMESTAMP__))
194 )) goto Abort;
195
196 //Tree.SetDesiredOpenKeyAccess(KEY_READ);
197
198 hr = pPrompt->SetPrompt(pSettings->GetPrompt());
199 if (FAILED(hr))
200 {
201 _ftprintf(stderr,_T("Cannot initialize prompt. Error is 0x%X.\n"),(unsigned int)hr);
202 goto Abort;
203 }
204
205 GetCommand:
206 // prompt
207 // TODO: make prompt user-customizable
208 Console.EnableWrite();
209 pPrompt->ShowPrompt(Console);
210 Console.FlushInputBuffer();
211
212 blnCommandExecutionInProgress = FALSE;
213
214 // Set command line color
215 Console.SetTextAttribute(pSettings->GetCommandTextAttributes());
216 if (!Console.ReadLine())
217 goto Abort;
218
219 // Set normal color
220 Console.SetTextAttribute(pSettings->GetNormalTextAttributes());
221
222 Console.BeginScrollingOperation();
223 blnCommandExecutionInProgress = TRUE;
224
225 // Parse command line (1st step - convert to multi sz)
226 Parser.SetArgumentList(pchCommand);
227
228 int nCommandReturnValue;
229 switch(CommandsList.Execute(Parser,nCommandReturnValue))
230 {
231 case -1: // not recognized command
232 {
233 Parser.ResetArgumentIteration();
234 TCHAR *pchCommandItself = Parser.GetNextArgument();
235 size_t cmdlen = _tcslen(pchCommandItself);
236 if ((!cmdlen)||
237 (pchCommandItself[cmdlen-1] != _T('\\'))||
238 (Parser.GetNextArgument())||
239 (!Tree.ChangeCurrentKey(pchCommandItself)))
240 {
241 Console.Write(_T("Unknown command \""));
242 Console.Write(pchCommandItself);
243 Console.Write(_T("\"\n"));
244 }
245 }
246 case -2: // empty line
247 goto GetCommand;
248 case 0: // exit command
249 nRetCode = 0;
250 Console.SetTextAttribute(wOldConsoleAttribute);
251 goto Exit;
252 default:
253 Console.Write(_T("\n"));
254 goto GetCommand;
255 }
256
257 Abort:
258 _ftprintf(stderr,_T("Abnormal program termination.\nPlease report bugs to ") EMAIL _T("\n"));
259 nRetCode = 1;
260
261 Exit:
262
263 if (pSettings)
264 delete pSettings;
265
266 if (pPrompt)
267 delete pPrompt;
268
269 return nRetCode;
270 }