ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/SearchInstaller/Worker.cpp
Revision: 368
Committed: 2008-08-23T02:44:00-07:00 (16 years, 9 months ago) by douglas
File size: 12015 byte(s)
Log Message:
Rearranged everything else.

File Contents

# User Rev Content
1 douglas 48 // Douglas Thrift's Search Engine Installer
2     //
3     // Douglas Thrift
4     //
5     // Worker.cpp
6    
7     #include "Worker.h"
8    
9     Worker::Worker()
10     {
11     OSVERSIONINFO os;
12     os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
13     GetVersionEx(&os);
14     nt = os.dwPlatformId == VER_PLATFORM_WIN32_NT ? true : false;
15    
16     if (nt)
17     {
18     single = false;
19    
20     HKEY hkey;
21     if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, NULL, 0, KEY_WRITE, &hkey) !=
22     ERROR_SUCCESS)
23     {
24     single = true;
25     }
26     else
27     {
28     unsigned char* crackers = new unsigned char[2];
29     crackers[0] = '#';
30     crackers[1] = '\0';
31    
32     if (RegSetValueEx(hkey, "cheese", 0, REG_SZ, crackers, 2)
33     != ERROR_SUCCESS)
34     {
35     single = true;
36     }
37    
38     RegDeleteValue(hkey, "cheese");
39     }
40    
41     RegCloseKey(hkey);
42     }
43     else
44     {
45     single = true;
46     }
47    
48     templates = true;
49    
50     char* programs = new char[MAX_PATH + 1];
51    
52     SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, SHGFP_TYPE_CURRENT,
53     programs);
54    
55     string search = "\\Douglas Thrift's Search Engine";
56     folder = programs + search;
57     delete [] programs;
58     }
59    
60     void Worker::work(HWND bar)
61     {
62     prepare(bar);
63     files(bar);
64     shortcuts(bar);
65     registry(bar);
66    
67     SendMessage(GetGrandParent(bar), PSM_PRESSBUTTON, (WPARAM)PSBTN_NEXT, 0);
68     }
69    
70     void Worker::prepare(HWND bar)
71     {
72     SendMessage(bar, PBM_SETRANGE, 0, MAKELPARAM(0, 50));
73    
74     ifstream fin("search.cgi.win");
75     ofstream fout("search.cgi");
76    
77     string perl;
78    
79     {
80     HKEY key;
81     const string BinDir = "BinDir";
82    
83     if (RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Perl", 0, KEY_READ,
84     &key) == ERROR_SUCCESS)
85     {
86     char* value = new char[16383 + 1];
87     unsigned long valueSize = 16383 + 1;
88     unsigned long type;
89     unsigned char* data = new unsigned char[MAX_PATH + 1];
90     unsigned long dataSize = MAX_PATH + 1;
91    
92     for (unsigned long index = 0; RegEnumValue(key, index, value,
93     &valueSize, NULL, &type, data, &dataSize) !=
94     ERROR_NO_MORE_ITEMS; index++)
95     {
96     if (value == BinDir && type == REG_SZ)
97     {
98     char* buffer = new char[dataSize + 1];
99     sprintf(buffer, "%s", data);
100     perl = buffer;
101     delete [] buffer;
102     break;
103     }
104     else
105     {
106     valueSize = 16383 + 1;
107     dataSize = MAX_PATH + 1;
108     }
109     }
110    
111     delete [] value;
112     delete [] data;
113     }
114     else if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Perl", 0,
115     KEY_READ, &key) == ERROR_SUCCESS)
116     {
117     char* value = new char[16383 + 1];
118     unsigned long valueSize = 16383 + 1;
119     unsigned long type;
120     unsigned char* data = new unsigned char[MAX_PATH + 1];
121     unsigned long dataSize = MAX_PATH + 1;
122    
123     for (unsigned long index = 0; RegEnumValue(key, index, value,
124     &valueSize, NULL, &type, data, &dataSize) !=
125     ERROR_NO_MORE_ITEMS; index++)
126     {
127     if (value == BinDir && type == REG_SZ)
128     {
129     char* buffer = new char[dataSize + 1];
130     sprintf(buffer, "%s", data);
131     perl = buffer;
132     delete [] buffer;
133     break;
134     }
135     else
136     {
137     valueSize = 16383 + 1;
138     dataSize = MAX_PATH + 1;
139     }
140     }
141    
142     delete [] value;
143     delete [] data;
144     }
145    
146     RegCloseKey(key);
147     SendMessage(bar, PBM_STEPIT, 0, 0);
148     }
149    
150     CreateDirectory(folder.c_str(), NULL);
151    
152     do
153     {
154     string line;
155     getline(fin, line);
156    
157     if (line == "#!C:\\Perl\\bin\\perl.exe")
158     {
159     if (perl != "" && line != "#!" + perl)
160     {
161     line = "#!" + perl;
162     }
163    
164     SendMessage(bar, PBM_STEPIT, 0, 0);
165     }
166     else if (line.find("my $root = ") == 0)
167     {
168     char* buffer = new char[MAX_PATH + 1];
169    
170     GetShortPathName(folder.c_str(), buffer, MAX_PATH + 1);
171    
172     string root = buffer;
173    
174     delete [] buffer;
175    
176     unsigned begin = 0;
177     do
178     {
179     unsigned slash = root.find('\\', begin);
180    
181     if (slash == string::npos) break;
182    
183     root.insert(slash, 1, '\\');
184    
185     begin = slash + 2;
186     }
187     while (begin < root.length());
188    
189     if (line != "my $root = \"" + root + "\";")
190     {
191     line = "my $root = \"" + root + "\";";
192     }
193    
194     SendMessage(bar, PBM_STEPIT, 0, 0);
195     }
196    
197     fout << line << (fin.good() ? "\n" : "");
198     }
199     while (fin.good());
200    
201     fin.close();
202     fout.close();
203     SendMessage(bar, PBM_STEPIT, 0, 0);
204    
205     if (nt)
206     {
207     fout.open("SearchPrompt.cmd");
208    
209     fout << "@echo off\n"
210     << "set PATH=" << folder << "\\bin;%PATH%\n"
211     << "set PROMPT=[Search$SEngine]$$$S\n"
212     << "Search -help\n";
213    
214     fout.close();
215     }
216     else
217     {
218     fout.open("SearchPrompt.bat");
219    
220     char* buffer = new char[MAX_PATH + 1];
221    
222     GetShortPathName(folder.c_str(), buffer, MAX_PATH + 1);
223    
224     fout << "@echo off\n"
225     << "set PATH=" << buffer << "\\bin;%PATH%\n"
226     << "set PROMPT=[Search Engine]$$ $S\n"
227     << "Search -help\n";
228    
229     delete [] buffer;
230    
231     fout.close();
232     }
233    
234     SendMessage(bar, PBM_STEPIT, 0, 0);
235     }
236    
237     void Worker::files(HWND bar)
238     {
239     SendMessage(bar, PBM_SETPOS, 0, 0);
240     SendDlgItemMessage(GetParent(bar), IDC_PROGRESS_TEXT, WM_SETTEXT, 0,
241     (LPARAM)(LPCTSTR)"Installing files...");
242    
243     vector<string> base;
244     base.push_back("LICENSE");
245     base.push_back("LICENSE.html");
246     base.push_back("README");
247     base.push_back("README.html");
248     base.push_back("osi-certified-90x75.png");
249     base.push_back("SearchUninstaller.exe");
250    
251     vector<string> bin;
252     bin.push_back("Search.exe");
253     bin.push_back(nt ? "SearchPrompt.cmd" : "SearchPrompt.bat");
254     bin.push_back("SearchPrompt.ico");
255    
256     vector<string> http;
257     http.push_back("search.cgi");
258     http.push_back("dtse_pb.png");
259    
260     vector<string> data;
261     if (templates)
262     {
263     data.push_back("header.html");
264     data.push_back("body.html");
265     data.push_back("footer.html");
266     data.push_back("notfound.html");
267     data.push_back("pages.html");
268     }
269    
270     SendMessage(bar, PBM_SETRANGE, 0, MAKELPARAM(0, (base.size() + bin.size() +
271     http.size() + data.size()) * 10));
272    
273     for (unsigned index = 0; index < base.size(); index++)
274     {
275     CopyFile(base[index].c_str(), (folder + '\\' + base[index]).c_str(),
276     false);
277    
278     SendMessage(bar, PBM_STEPIT, 0, 0);
279     }
280    
281     CreateDirectory((folder + "\\bin").c_str(), NULL);
282    
283     for (index = 0; index < bin.size(); index++)
284     {
285     CopyFile(bin[index].c_str(), (folder + "\\bin\\" + bin[index]).c_str(),
286     false);
287    
288     SendMessage(bar, PBM_STEPIT, 0, 0);
289     }
290    
291     CreateDirectory((folder + "\\http").c_str(), NULL);
292    
293     for (index = 0; index < http.size(); index++)
294     {
295     CopyFile(http[index].c_str(), (folder + "\\http\\" +
296     http[index]).c_str(), false);
297    
298     SendMessage(bar, PBM_STEPIT, 0, 0);
299     }
300    
301     CreateDirectory((folder + "\\data").c_str(), NULL);
302    
303     for (index = 0; index < data.size(); index++)
304     {
305     CopyFile(data[index].c_str(), (folder + "\\data\\" +
306     data[index]).c_str(), false);
307    
308     SendMessage(bar, PBM_STEPIT, 0, 0);
309     }
310     }
311    
312     void Worker::shortcuts(HWND bar)
313     {
314     SendMessage(bar, PBM_SETPOS, 0, 0);
315     SendDlgItemMessage(GetParent(bar), IDC_PROGRESS_TEXT, WM_SETTEXT, 0,
316     (LPARAM)(LPCTSTR)"Creating shortcuts...");
317    
318     SendMessage(bar, PBM_SETRANGE, 0, MAKELPARAM(0, 40));
319    
320     char* buffer = new char[MAX_PATH + 1];
321     SHGetFolderPath(GetGrandParent(bar), single ? CSIDL_PROGRAMS :
322     CSIDL_COMMON_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, buffer);
323     string programs = buffer;
324     delete [] buffer;
325    
326     CreateDirectory((programs + "\\Douglas Thrift\'s Search Engine").c_str(),
327     NULL);
328    
329     IPersistFile* link;
330     IShellLink* prompt;
331    
332     string description = string("Command Prompt for configuring Douglas Thrif")
333     +"t\'s Search Engine";
334    
335     CoInitialize(NULL);
336     CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
337     IID_IShellLink, (LPVOID*)&prompt);
338    
339     prompt->SetPath(getenv("ComSpec"));
340     if (nt)
341     {
342     string arguments = "/k \"" + folder + "\\bin\\SearchPrompt.cmd\"";
343    
344     prompt->SetArguments(arguments.c_str());
345     prompt->SetDescription(description.c_str());
346     }
347     else
348     {
349     char* buffer = new char[MAX_PATH + 1];
350    
351     GetShortPathName((folder + "\\bin\\SearchPrompt.bat").c_str(), buffer,
352     MAX_PATH + 1);
353    
354     string arguments = string("/e:4096 /k ") + buffer;
355    
356     delete [] buffer;
357    
358     prompt->SetArguments(arguments.c_str());
359     prompt->SetDescription("Search Engine Prompt");
360     }
361     prompt->SetIconLocation((folder + "\\bin\\SearchPrompt.ico").c_str(), 0);
362     prompt->SetWorkingDirectory((folder + "\\data").c_str());
363     prompt->QueryInterface(IID_IPersistFile, (LPVOID*)&link);
364    
365     unsigned short* file = new unsigned short[MAX_PATH + 1];
366    
367     MultiByteToWideChar(CP_ACP, 0, (programs + "\\Douglas Thrift\'s Search Eng"
368     + "ine\\Search Engine Prompt." + (nt ? "lnk" : "pif")).c_str(), -1,
369     file, MAX_PATH + 1);
370    
371     link->Save(file, true);
372     link->Release();
373     prompt->Release();
374     delete [] file;
375    
376     SendMessage(bar, PBM_STEPIT, 0, 0);
377    
378     IShellLink* license;
379    
380     description = "Douglas Thrift\'s Search Engine License";
381    
382     CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
383     IID_IShellLink, (LPVOID*)&license);
384    
385     license->SetPath((folder + "\\LICENSE.html").c_str());
386     license->SetDescription(description.c_str());
387     license->QueryInterface(IID_IPersistFile, (LPVOID*)&link);
388    
389     file = new unsigned short[MAX_PATH + 1];
390    
391     MultiByteToWideChar(CP_ACP, 0, (programs + "\\Douglas Thrift\'s Search Eng"
392     + "ine\\License.lnk").c_str(), -1, file, MAX_PATH + 1);
393    
394     link->Save(file, true);
395     link->Release();
396     license->Release();
397     delete [] file;
398    
399     SendMessage(bar, PBM_STEPIT, 0, 0);
400    
401     IShellLink* readme;
402    
403     description = "Douglas Thrift\'s Search Engine ReadMe";
404    
405     CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
406     IID_IShellLink, (LPVOID*)&readme);
407    
408     readme->SetPath((folder + "\\README.html").c_str());
409     readme->SetDescription(description.c_str());
410     readme->QueryInterface(IID_IPersistFile, (LPVOID*)&link);
411    
412     file = new unsigned short[MAX_PATH + 1];
413    
414     MultiByteToWideChar(CP_ACP, 0, (programs + "\\Douglas Thrift\'s Search Eng"
415     + "ine\\ReadMe.lnk").c_str(), -1, file, MAX_PATH + 1);
416    
417     link->Save(file, true);
418     link->Release();
419     readme->Release();
420     delete [] file;
421    
422     SendMessage(bar, PBM_STEPIT, 0, 0);
423    
424     IShellLink* uninstall;
425    
426     description = "Uninstall Douglas Thrift\'s Search Engine";
427    
428     CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
429     IID_IShellLink, (LPVOID*)&uninstall);
430    
431     uninstall->SetPath((folder + "\\SearchUninstaller.exe").c_str());
432     uninstall->SetIconLocation((folder + "\\SearchUninstaller.exe").c_str(),
433     0);
434     uninstall->SetDescription(description.c_str());
435     uninstall->QueryInterface(IID_IPersistFile, (LPVOID*)&link);
436    
437     file = new unsigned short[MAX_PATH + 1];
438    
439     MultiByteToWideChar(CP_ACP, 0, (programs + "\\Douglas Thrift\'s Search Eng"
440     + "ine\\Uninstall.lnk").c_str(), -1, file, MAX_PATH + 1);
441    
442     link->Save(file, true);
443     link->Release();
444     uninstall->Release();
445     delete [] file;
446    
447     SendMessage(bar, PBM_STEPIT, 0, 0);
448     }
449    
450     void Worker::registry(HWND bar)
451     {
452     SendMessage(bar, PBM_SETPOS, 0, 0);
453     SendDlgItemMessage(GetParent(bar), IDC_PROGRESS_TEXT, WM_SETTEXT, 0,
454     (LPARAM)(LPCTSTR)"Registering files...");
455    
456     SendMessage(bar, PBM_SETRANGE, 0, MAKELPARAM(0, 90));
457    
458     HKEY hkey;
459     string subkey = string("Software\\Microsoft\\Windows\\CurrentVersion\\Uni")
460     + "nstall\\Douglas Thrift\'s Search Engine";
461     RegCreateKeyEx(single && nt ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
462     subkey.c_str(), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
463     &hkey, NULL);
464    
465     vector<string> values;
466     vector<string> data;
467    
468     values.push_back("Contact");
469     data.push_back("Douglas Thrift");
470    
471     values.push_back("DisplayIcon");
472     data.push_back(folder + "\\bin\\Search.exe,0");
473    
474     values.push_back("DisplayName");
475     data.push_back("Douglas Thrift\'s Search Engine");
476    
477     values.push_back("DisplayVersion");
478     data.push_back("1.1");
479    
480     values.push_back("InstallLocation");
481     data.push_back(folder);
482    
483     values.push_back("Publisher");
484     data.push_back("DouglasThrift.net");
485    
486     values.push_back("Readme");
487     data.push_back(folder + "\\README.html");
488    
489     values.push_back("UninstallString");
490     data.push_back(folder + "\\SearchUninstaller.exe");
491    
492     values.push_back("URLInfoAbout");
493     data.push_back("http://computers.douglasthrift.net/searchengine/");
494    
495     for (unsigned index = 0; index < values.size(); index++)
496     {
497     unsigned char* buffer = new unsigned char[data[index].length() + 1];
498     for (unsigned number = 0; number < data[index].length(); number++)
499     {
500     buffer[number] = data[index][number];
501     }
502     buffer[number] = '\0';
503    
504     RegSetValueEx(hkey, values[index].c_str(), 0, REG_SZ, buffer, number +
505     1);
506    
507     delete [] buffer;
508    
509     SendMessage(bar, PBM_STEPIT, 0, 0);
510     }
511    
512     RegCloseKey(hkey);
513     }