ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/AE/Installer/trunk/source/main_window.cpp
(Generate patch)

Comparing AE/Installer/trunk/source/main_window.cpp (file contents):
Revision 393 by iritscen, Mon Jul 6 15:39:35 2009 UTC vs.
Revision 526 by gumby, Sat May 22 22:07:58 2010 UTC

# Line 1 | Line 1
1 < /*
2 < AE/Mod Installer
3 < by Gumby and Iritscen
4 < */
5 <
6 < // To-do: - Load credits from text resource file
7 < //                - Institute lots of checks into file-handling
8 < //                - Clear mod info fields when mod is de-selected
9 <
10 < #define DEBUG
11 < #include <stdio.h>
12 < //#include <conio.h>
13 < //#include <process.h>
14 < #include <string>
15 < #include <iostream>
16 < #include <cctype>
17 < #include <vector>
18 < #include <fstream>
19 < #include <errno.h>
20 < #include <sstream>
21 <
22 < #include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations
23 < #include "boost/lexical_cast.hpp" //int -> string
24 < #include "installer.h"
1 > /***************************************************************************\
2 > | Project: AE Installer                                                                                                         |
3 > | By: Gumby & Iritscen                                                                                                          |
4 > | File: Main_Window.cpp                                                                                                         |
5 > | Function: Handles the GUI.                                                                                            |
6 > | Created: 07/05/2009 20:38:25                                                                                          |
7 > \***************************************************************************/
8  
9 < #ifdef WIN32
10 < #include <windows.h>
28 < #else // assume we're on Mac
29 < #include <stdlib.h>
30 < #include <dirent.h>
9 > #ifndef NTDDI_VERSION          
10 > #define NTDDI_VERSION NTDDI_WIN7
11   #endif
32
33 //const string strInstallerVersion = "1.0";
34 const bool SPLIT = 1;
35 const bool NOT_SPLIT = 0;
36 bool splitInstances = SPLIT;
37 bool busy = 0;
12   #ifdef WIN32
13 < const string strOniSplit = "Onisplit.exe";
14 < string strImportOption = "-import:nosep";
15 < const char* strClsCmd = "cls";
16 < const char* strPauseCmd = "PAUSE";
17 < #else // set up Mac equivalents since we're in Mac OS
44 < const string strOniSplit = "mono Onisplit.exe";
45 < string strImportOption = "-import:sep";
46 < const char* strClsCmd = "clear";
47 < const char* strPauseCmd = "read -n 1 -p \"Press any key to continue\"";
48 < void Sleep(int ms) { sleep( ms / 1000 ); }
49 < #endif
50 <
51 < using namespace boost::filesystem;
52 < using namespace std;
53 <
54 <
55 <
56 <
57 < #include "boost/date_time/gregorian/gregorian.hpp"
58 < #include "boost/date_time/date_parsing.hpp"
59 < #include "boost/date_time/posix_time/posix_time.hpp"
60 <
61 < string escapePath(string input) {
62 <        
63 <        string output;
64 <        string escape_me = "& ;()|<>\"'\\#*?$";
65 <        for(int i = 0; i < input.size(); i++)  {
66 <                for(int j = 0; j < escape_me.size(); j++) if (input[i] == escape_me[j]) output += '\\';
67 <                output += input[i];
68 <        }
69 <        return output;
70 < }
71 <
72 < int globalizeData(void)
73 < {
74 <        busy = 1;
75 <        using boost::lexical_cast;
76 <        using boost::bad_lexical_cast;
77 <        // using namespace boost::posix_time;
78 <        using namespace boost::gregorian;
79 <        using namespace boost::posix_time;
80 <        ptime start_time(second_clock::local_time());
81 <
82 <        setStatusArea("Globalizing!");
83 <        int err = 0;
84 <        int parts_done = 0;
85 <        char Step_x_x[300];
86 <        //char levels[i][5];
87 <        remove("Globalize.log");
88 <        ofstream logfile("Globalize.log");
89 <        logfile << "Globalization started " << to_simple_string(start_time) << endl;
90 <        try {
91 <
92 <                char levels_cstr[15][3] = {"0", "1", "2", "3", "4", "6", "8", "9", "10", "11", "12", "13", "14", "18", "19"}; // the levels Oni has...probably should have made a string array. Oops.
93 <                //const vector<double> ck(cv, &cv[CvSize]);
94 <                vector<string> levels;
95 <                for (int f = 0; f < 15; f++) {
96 <                        levels.push_back(levels_cstr[f]);
97 <                }
98 <                char choice = 0;
99 <
100 <                //SetCurrentDirectory("C:/Program Files/Oni/edition/install");
101 <                ///char levels[i][3];
102 <                path Characters = "../GameDataFolder/level0_Characters";
103 <                path Particles = "../GameDataFolder/level0_Particles";
104 <                path Archive = "../GameDataFolder/Archive";
105 <                path Textures  = "../GameDataFolder/level0_Textures";
106 <                path Sounds = "../GameDataFolder/level0_Sounds";
107 <                path Animations = "../GameDataFolder/level0_Animations";
108 <                path TRAC = Animations / "level0_TRAC";
109 <                path TRAM = Animations / "level0_TRAM";
110 <
111 <                vector<path> GDFPaths;
112 <                GDFPaths.push_back(Characters);
113 <                GDFPaths.push_back(Particles);
114 <                GDFPaths.push_back(Textures);
115 <                GDFPaths.push_back(Sounds);
116 <                GDFPaths.push_back(TRAC);
117 <                GDFPaths.push_back(TRAM);
118 <
119 <
120 <                path VanillaCharacters = "packages/VanillaDats/level0_Final/level0_Characters/level0_Characters.oni";
121 <                path VanillaParticles = "packages/VanillaDats/level0_Final/level0_Particles/level0_Particles.oni";
122 <                path VanillaTextures  = "packages/VanillaDats/level0_Final/level0_Textures/level0_Textures.oni";
123 <                path VanillaSounds = "packages/VanillaDats/level0_Final/level0_Sounds/level0_Sounds.oni";
124 <                path VanillaAnimations = "packages/VanillaDats/level0_Final/level0_Animations/level0_Animations.oni";
125 <                path VanillaTRAC = "packages/VanillaDats/level0_Final/level0_Animations/level0_TRAC.oni";
126 <                path VanillaTRAM = "packages/VanillaDats/level0_Final/level0_Animations/level0_TRAM.oni";
127 <
128 <                vector<path> VanillaPaths;
129 <
130 <                VanillaPaths.push_back(VanillaCharacters);
131 <                VanillaPaths.push_back(VanillaParticles);
132 <                VanillaPaths.push_back(VanillaTextures);
133 <                VanillaPaths.push_back(VanillaSounds);
134 <                VanillaPaths.push_back(VanillaTRAC);
135 <                VanillaPaths.push_back(VanillaTRAM);
136 <
137 <                /*
138 <                if (exists("../GameDataFolder/"))
139 <                {
140 <                //cout << "\nIt looks like you've already globalized Oni's data.\nDo you want to re-globalize?\n(This will erase existing mods installed to the AE's game data.)"
141 <                //       << "\n1. Re-globalize"
142 <                //       << "\n2. Return to main menu\n";
143 <                //choice = cin.get();
144 <                cin.ignore(128, '\n');
145 <                if (choice == '1')
146 <                remove_all("../GameDataFolder"); // remove AE GDF
147 <                if (choice == '2')
148 <                return 0;
149 <                }
150 <                */
151 <                setStatusArea("Removing old GameDataFolder...\n");
152 <                logfile <<  "Removing old GameDataFolder...\n";
153 <                remove_all( "../GameDataFolder/" );
154 <                setStatusArea("Creating needed directories...");
155 <                logfile <<  "Creating needed directories...\n";
156 <                create_directory( "../GameDataFolder/" );
157 <
158 <                create_directory( "packages" );
159 <
160 <                if (exists("packages/VanillaDats")) remove_all("packages/VanillaDats");
161 <                create_directory( "packages/VanillaDats" );
162 <                create_directory( "packages/VanillaDats/level0_Final/" );
163 <                //blah blah finish this.
164 <                //logfile <<  "packages/VanillaDats/level0_Final/ created";
165 <                create_directory( Characters );
166 <                create_directory( Particles );
167 <                create_directory( Archive );
168 <                create_directory( Textures );
169 <                create_directory( Sounds );
170 <                create_directory( Animations );
171 <                create_directory( TRAC );
172 <                create_directory( TRAM );
173 <                int num_levels = 0;
174 <                for(int i = 1; i < 15; i++)
175 <                {
176 <                        if (exists("../../GameDataFolder/level" + levels[i] + "_Final.dat")) {
177 <                                num_levels++;
178 <
179 <                        }
180 <                }
181 <                logfile << "Exporting and moving...\n\n";
182 <                int total_steps =  8 + 2 * num_levels;
183 <                for(int i = 0; i < 15; i++)
184 <                {
185 <
186 <                        //printf(levels[i],"%d",levels[i]); // int to char array
187 <
188 <                        if (exists("../../GameDataFolder/level" + levels[i] + "_Final.dat")) {
189 <                                logfile << "level" << levels[i] << "_Final\n";
190 <                                logfile << "\tExporting level" << levels[i] << "_Final.dat\n";
191 <                                //printf(Step_x_x,"Step %d/%d: exporting level%d_final.dat", parts_done + 1,, levels[i]); setStatusArea((string)Step_x_x);
192 <                                setStatusArea("Step " + lexical_cast<std::string>(parts_done + 1) + "/" + lexical_cast<std::string>(total_steps) + " exporting level" + levels[i]+"_Final.dat");
193 <                                create_directory( "../GameDataFolder/level" + levels[i] + "_Final" );
194 <                                //                              setStatusArea(strOniSplit + " -export ../GameDataFolder/level" + levels[i] + "_Final ../../GameDataFolder/level" + levels[i] + "_Final.dat");
195 <                                system((strOniSplit + " -export ../GameDataFolder/level" + levels[i] + "_Final ../../GameDataFolder/level" + levels[i] + "_Final.dat").c_str());
196 <                                create_directory( "packages/VanillaDats/level" + levels[i] + "_Final" );
197 <                                create_directory( "packages/VanillaDats/level" + levels[i] + "_Final/level" + levels[i] + "_Final" );
198 <
199 <                                directory_iterator end_iter;
200 <                                for ( directory_iterator dir_itr( "../GameDataFolder/level" + levels[i] + "_Final" ); dir_itr != end_iter; ++dir_itr )
201 <                                {
202 <                                        //cout << dir_itr->path().filename();
203 <                                        if ( is_regular_file( dir_itr->status() ) )
204 <                                        {
205 <                                                if ( dir_itr->path().filename().substr(0,8) == "TXMPfail" ||
206 <                                                        dir_itr->path().filename().substr(0,9) == "TXMPlevel" ||
207 <                                                        ( dir_itr->path().filename().substr(0,4) == "TXMP" && dir_itr->path().filename().find("intro")!=string::npos) ||
208 <                                                        dir_itr->path().filename().substr(0,4) == "TXMB" ||
209 <                                                        dir_itr->path().filename() == "M3GMpowerup_lsi.oni" ||
210 <                                                        dir_itr->path().filename() == "TXMPlsi_icon.oni" ||
211 <                                                        ( dir_itr->path().filename().substr(0,4) == "TXMB" && dir_itr->path().filename().find("splash_screen.oni")!=string::npos)       )
212 <                                                {
213 <                                                        cout <<dir_itr->path().filename() << "\n";
214 <                                                        create_directory( dir_itr->path().parent_path() / "NoGlobal");  
215 <                                                        if(!exists( dir_itr->path().parent_path() / "NoGlobal" / dir_itr->filename())) rename(dir_itr->path(), dir_itr->path().parent_path() / "NoGlobal" /
216 <                                                                dir_itr->filename());
217 <                                                        else remove(dir_itr->path());
218 <                                                }
219 <                                                else if (dir_itr->path().filename().substr(0,4) == "TRAC"
220 <                                                        || dir_itr->path().filename().substr(0,4) == "ONVL") {
221 <                                                                cout <<dir_itr->path().filename() << "\n";
222 <                                                                if(!exists( TRAC / dir_itr->filename())) rename(dir_itr->path(), TRAC / dir_itr->filename());
223 <                                                                else remove(dir_itr->path());
224 <                                                }
225 <                                                else if (dir_itr->path().filename().substr(0,4) == "TRAM") {
226 <                                                        cout <<dir_itr->path().filename() << "\n";
227 <                                                        if(!exists( TRAM / dir_itr->filename())) rename(dir_itr->path(), TRAM / dir_itr->filename());
228 <                                                        else remove(dir_itr->path());
229 <                                                }
230 <                                                else if (dir_itr->path().filename().substr(0,4) == "ONSK" ||
231 <                                                        dir_itr->path().filename().substr(0,4) == "TXMP") {
232 <                                                                cout <<dir_itr->path().filename() << "\n";\
233 <                                                                        create_directory( dir_itr->path().parent_path() / "TexFix");    
234 <                                                                if(!exists( Textures / dir_itr->filename())) rename(dir_itr->path(), Textures / dir_itr->filename());
235 <                                                                //rename(dir_itr->path(), dir_itr->path().parent_path() / "TexFix" / dir_itr->filename());
236 <                                                }
237 <                                                else if (dir_itr->path().filename().substr(0,4) == "ONCC"
238 <                                                        || dir_itr->path().filename().substr(0,4) == "TRBS"
239 <                                                        || dir_itr->path().filename().substr(0,4) == "ONCV"
240 <                                                        || dir_itr->path().filename().substr(0,4) == "TRMA"
241 <                                                        || dir_itr->path().filename().substr(0,4) == "TRSC"
242 <                                                        || dir_itr->path().filename().substr(0,4) == "TRAS") {
243 <                                                                cout <<dir_itr->path().filename() << "\n";
244 <                                                                if(!exists( Characters / dir_itr->filename())) rename(dir_itr->path(), Characters / dir_itr->filename());
245 <                                                                else remove(dir_itr->path());
246 <                                                }
247 <                                                else if (dir_itr->path().filename().substr(0,4) == "OSBD"
248 <                                                        || dir_itr->path().filename().substr(0,4) == "SNDD") {
249 <                                                                cout << dir_itr->path().filename() << "\n";
250 <                                                                if(!exists( Sounds / dir_itr->filename())) rename(dir_itr->path(), Sounds / dir_itr->filename());
251 <                                                                else remove(dir_itr->path());
252 <                                                }
253 <                                                else if (dir_itr->path().filename().substr(0,5) == "BINA3"
254 <                                                        || dir_itr->path().filename().substr(0,10) == "M3GMdebris"
255 <                                                        || dir_itr->path().filename() == "M3GMtoxic_bubble.oni"
256 <                                                        || dir_itr->path().filename().substr(0,8) == "M3GMelec"
257 <                                                        || dir_itr->path().filename().substr(0,7) == "M3GMrat"
258 <                                                        || dir_itr->path().filename().substr(0,7) == "M3GMjet"
259 <                                                        || dir_itr->path().filename().substr(0,9) == "M3GMbomb_"
260 <                                                        || dir_itr->path().filename() == "M3GMbarab_swave.oni"
261 <                                                        || dir_itr->path().filename() == "M3GMbloodyfoot.oni"
262 <                                                        ){
263 <                                                                cout <<dir_itr->path().filename() << "\n";
264 <                                                                if(!exists( Particles / dir_itr->filename())) rename(dir_itr->path(), Particles / dir_itr->filename());
265 <                                                                else remove(dir_itr->path());
266 <                                                }
267 <                                                else if (dir_itr->path().filename().substr(0,4) == "AGDB"
268 <                                                        || dir_itr->path().filename().substr(0,4) == "TRCM") {
269 <                                                                cout <<dir_itr->path().filename() << "\n";
270 <
271 <                                                                if(!exists( Archive / dir_itr->filename())) rename(dir_itr->path(), Archive / dir_itr->filename());
272 <                                                                else remove(dir_itr->path());
273 <                                                }
274 <                                                else if (dir_itr->path().filename().substr(0,4) == "ONWC") { //fix for buggy ONWC overriding
275 <                                                                cout <<dir_itr->path().filename() << "\n";
276 <
277 <                                                                if(!exists( "packages/VanillaDats/level" + levels[i] + "_Final/level" + levels[i] + "_Final/" +  dir_itr->filename())) rename(dir_itr->path(), "packages/VanillaDats/level" + levels[i] + "_Final/level" + levels[i] + "_Final/" +  dir_itr->filename());
278 <                                                                else remove(dir_itr->path());
279 <                                                }
280 <                                                if (exists(dir_itr->path())) {
281 <
282 <                                                }
283 <                                                else {
284 <                                                        //logfile << "\tMoved file: " << dir_itr->path().filename() << "\n";
285 <                                                }
286 <                                        }
287 <
288 <
289 <
290 <                                }
291 <                                logfile << "\tCleaning up TXMPs...\n";
292 <                                system( (strOniSplit + " -move:delete " + Textures.string() + " ../GameDataFolder/level" + levels[i] + "_Final/TXMP*.oni").c_str());
293 <                                parts_done++;
294 <
295 <                                setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) ));
296 <
297 <                        }
298 <                }
299 <                logfile << "Reimporting levels\n";
300 <                for (int i = 0; i < 15; i++)
301 <                {
302 <                        logfile << "\tReimporting level" << levels[i] << "_Final.oni\n";
303 <                        //printf(levels[i],"%d",levels[i]);
304 <                        //printf(Step_x_x,"Step %d/%d: reimporting level", parts_done + 1, 7 + 2 * num_levels); setStatusArea((string)Step_x_x + levels[i] + (string)"_Final.dat");
305 <                        setStatusArea("Step " + lexical_cast<std::string>(parts_done + 1) + "/" + lexical_cast<std::string>(total_steps) + " reimporting level" + levels[i]+"_Final.oni");
306 <                        logfile << (strOniSplit + " " + strImportOption + " ../GameDataFolder/level" + levels[i] + "_Final packages/VanillaDats/level" + levels[i] + "_Final/level"
307 <                                + levels[i] + "_Final/level" + levels[i] + "_Final.oni >> Globalize.log").c_str() << '\n';
308 <                        string sys_str = (strOniSplit + " " + strImportOption + " ../GameDataFolder/level" + levels[i] + "_Final packages/VanillaDats/level" + levels[i] + "_Final/level"
309 <                                + levels[i] + "_Final/level" + levels[i] + "_Final.oni >> Globalize2.log");
310 <                                system(sys_str.c_str() );
311 <                        setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) ));
312 <                        parts_done++;
313 <                }
314 <                create_directory( VanillaCharacters.parent_path() );
315 <                create_directory( VanillaParticles.parent_path() );
316 <                create_directory( VanillaTextures.parent_path() );
317 <                create_directory( VanillaSounds.parent_path() );
318 <                create_directory( VanillaAnimations.remove_filename() );
319 <
320 <                for(int j = 0; j < GDFPaths.size(); j++) {
321 <                        logfile << "\tReimporting " << GDFPaths[j].filename() << ".oni\n";
322 <                        setStatusArea("Step " + lexical_cast<std::string>(parts_done + 1) + "/" + lexical_cast<std::string>(total_steps) + ": reimporting " + GDFPaths[j].filename() );
323 <                        system((strOniSplit + " " + strImportOption + " " + GDFPaths[j].string() + " " + VanillaPaths[j].string()).c_str());
324 <                        parts_done++;
325 <                        setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) ));
326 <                }
327 <                /*
328 <                printf(Step_x_x,"Step %d/%d: reimporting level0_Characters", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
329 <                system((strOniSplit + " " + strImportOption + " " + Characters.string() + " " + VanillaCharacters.string()).c_str());
330 <                parts_done++; printf(Step_x_x,"Step %d/%d: reimporting level0_Particles", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
331 <                system((strOniSplit + " " + strImportOption + " " + Particles.string() + " " + VanillaParticles.string()).c_str());
332 <                parts_done++; printf(Step_x_x,"Step %d/%d: reimporting level0_Textures", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
333 <                system((strOniSplit + " " + strImportOption + " " + Textures.string() + " " + VanillaTextures.string()).c_str());
334 <                //system((strOniSplit   + " " + strImportOption + (string)" " + Animations.string() + (string)" " + VanillaAnimations.string()).c_str());
335 <                parts_done++; printf(Step_x_x,"Step %d/%d: reimporting level0_TRAC", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
336 <                system((strOniSplit + " " + strImportOption + " " + TRAC.string() + " " + VanillaTRAC.string()).c_str());
337 <                parts_done++; printf(Step_x_x,"Step %d/%d: reimporting level0_Sounds", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
338 <                system((strOniSplit + " " + strImportOption + " " + Sounds.string() + " " + VanillaSounds.string()).c_str());
339 <                parts_done++; printf(Step_x_x,"Step %d/%d: reimporting level0_TRAM", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
340 <                system((strOniSplit + " " + strImportOption + " " + TRAM.string() + " " + VanillaTRAM.string()).c_str());
341 <                //parts_done++; setStatusArea((string)"Copying level scripts...");setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
342 <                if (exists("../GameDataFolder/IGMD")) remove_all("../GameDataFolder/IGMD");
343 <                */
344 <                create_directory((path)"../GameDataFolder/IGMD");
345 <                copy((path)"packages/VanillaBSL/IGMD", (path)"../GameDataFolder");
346 <                setProgressBar( 1000 );
347 <                
348 <                // CIP:last of all, set up the edition folder as a playable Oni installation by placing the latest application (+ Daodan DLL on Windows) in edition/
349 <                // or we could just include it in the zip in the proper place already.
350 <
351 <                copy("../../persist.dat","../persist.dat");
352 <                copy("../../keyconfig.txt","../keyconfig.txt");
353 < #ifndef WIN32
354 <                /* On Mac only, set the current GDF to the AE GDF by writing to Oni's global preferences file (thankfully a standard OS X ".plist" XML file).
355 <                   If there are no Oni prefs (only possible if Oni has not been run even once), then the above line will fail silently, no harm done,
356 <                   and when the user does run Oni for the first time, using the copy of the app in the AE GDF, Oni will set the prefs to use that GDF at that point */
357 <                string fullAEpath = escapePath(system_complete(".").parent_path().parent_path().string()); // get full path for Installer
358 <                char prefsCommand[300] = "defaults write com.godgames.oni RetailInstallationPath -string '";
359 <                strcat(prefsCommand, fullAEpath.c_str()); // get path of edition/ folder (Oni wants the folder that *contains* the GDF)
360 <                strcat(prefsCommand, "'"); // path string is enclosed in single quotes to avoid the need to escape UNIX-unfriendly characters
361 <                system(prefsCommand);
362 <                
13 > #include <windows.h>
14 > #include <shobjidl.h>
15 > HWND Handle;
16 > ITaskbarList *pTaskbarList;
17 > ITaskbarList3 *pTaskbarList3;
18   #endif
364                
365                
366                setStatusArea((string)"Done! Now select your mod packages and click install.");
367                //      while(1) Sleep(-1);
368
369        }
370        catch (exception ex) {
371                setStatusArea("Warning, handled exception: " + (string)ex.what());
372        }
373
374        ptime end_time(second_clock::local_time());
375        time_period total_time (start_time, end_time);
376        logfile << "\n\nGlobalization ended " << to_simple_string(end_time) << "\nThe process took " << total_time.length();
377        //total_time.length().hours();
378        logfile.close();
379        busy = 0;
380        return err;
381 }
382
383
384 vector<ModPackage> getPackages(void)
385 {
386        vector<ModPackage> packages;
387        packages.reserve(65536); // come on, we shouldn't need this much space...right?!
388        fstream file;
389        string filename = "\0";
390        string MODINFO_CFG = "Mod_Info.cfg";
391
392        try
393        {
394                directory_iterator end_iter;
395                for (directory_iterator dir_itr("./packages"); dir_itr != end_iter; ++dir_itr)
396                {
397                        file.open((dir_itr->path().string() + "/" + MODINFO_CFG).c_str());
398                        //cout << filename << "\n";
399
400                        if(!file.fail())
401                        {
402                                //cout << dir_itr->path().string() + MODINFO_CFG;
403                                //would prefer to push a pointer to a package, but this will do for now
404                                packages.push_back(fileToModPackage(file));
405                        }      
406                        file.close();
407                        file.clear();
408                }
409                sort(packages.begin(), packages.end());
410        }
411        catch (const std::exception & ex)
412        {
413                cout << "Warning, something odd happened!\n";
414        }
19  
416        return packages;
417 }
418
419 ModPackage fileToModPackage(fstream &file)
420 {
421        /*
422        This converts a file to a ModPackage struct.
423
424        A few notes...
425        "iter" is the current word we are on. I should have named it "token" or something, but I don't have multiple iterators, so its ok.
426        I refer to (*iter) at the beginning of each if statement block. I could probably store it as a variable, but I'm pretty sure that dereferencing a pointer\iterator isn't much
427        slower than reading a variable.
428        */
429        ModPackage package;
430        string line;
431        static string NameOfMod = "NameOfMod";  //used for comparing to the current token...
432        //I could have done it in reverse (*iter).compare("ModString") or  
433        static string ARROW = "->";                             //did something like "ModString".compare(*iter), and it would have been
434        static string ModString = "ModString";  //functionably the same.
435        static string HasOnis = "HasOnis";
436        static string HasDeltas = "HasDeltas";
437        static string HasBSL = "HasBSL";
438        static string HasDats = "HasDats";
439        static string IsEngine = "IsEngine";
440        static string Readme = "Readme";
441        static string GlobalNeeded = "GlobalNeeded";
442        static string Category = "Category";
443        static string Creator = "Creator";
444        while (! file.eof() )
445        {
446                getline (file,line);
447                vector<string> tokens;
448                vector<string>::iterator iter;
449                tokenize(line, tokens);                                 //string to vector of "words"
450                if (tokens.capacity() >= 2) {                   //make sure they are using enough stuff
451                        iter = tokens.begin();                          //what word we are on, starts at first word
452                        /*
453                        if (!AEInstallVersion.compare(*iter))
454                        If mod is too old, skip this mod.
455                        */
456                        /*else*/if (!NameOfMod.compare(*iter))  {       //if it contains the name
457                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
458                                        if (ARROW.compare(*iter) && NameOfMod.compare(*iter)) {                 //ignores "->" and "NameOfMod"
459                                                //cout << *iter;
460                                                //cout << " ";
461                                                package.name += *iter + " ";
462                                        }
463                                }
464
465                        }
466                        else if (!ModString.compare(*iter)) {
467                                iter++; iter++;
468                                package.modStringName = *iter;
469                                iter++;
470                                package.modStringVersion = atoi((*iter).c_str());
471                        }
472                        else if (!HasOnis.compare(*iter)) {
473                                iter++; iter++;  
474                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasOnis = 1; //Gotta love c++'s lack of a standard case-insensitive
475                                else if (!HasBSL.compare(*iter)) { // string comparer...I know my implementation here sucks. I need to change it to check each character one by one. At the moment,
476                                        iter++; iter++;}  // using "YFR" would probably set it off. :<
477
478                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasBSL = 1;
479                        }
480                        else if (!HasDeltas.compare(*iter)) {
481                                iter++; iter++;  
482                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDeltas = 1;
483                        }
484                        else if (!HasDats.compare(*iter)) {
485                                iter++; iter++;  
486                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDats = 1;
487                        }
488                        else if (!IsEngine.compare(*iter)) {
489                                iter++; iter++;  
490                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.isEngine = 1;
491                        }
492                        else if (!GlobalNeeded.compare(*iter)) {
493                                iter++; iter++;  
494                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.globalNeeded = 1;
495                                else if (toupper((*iter)[0]) + toupper((*iter)[1]) == 'N' + 'O') package.globalNeeded = 1; //Really the only place where checking for "No" is important atm.
496                        }
497                        else if (!Category.compare(*iter))  {  
498                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
499                                        if (ARROW.compare(*iter) && Category.compare(*iter)) {                  //ignores "->" and "Category"
500                                                //cout << *iter;
501                                                //cout << " ";
502                                                package.category += *iter + " ";
503                                        }
504                                }
505                        }
506                        else if (!Creator.compare(*iter))  {    //if it contains the name
507                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
508                                        if (ARROW.compare(*iter) && Creator.compare(*iter)) {                   //ignores "->" and "Category"
509                                                //cout << *iter;
510                                                //cout << " ";
511                                                package.creator += *iter + " ";
512                                        }
513                                }
514                        }
515                        else if (!Readme.compare(*iter))  {     //if it contains the name
516                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
517                                        if (ARROW.compare(*iter) && Readme.compare(*iter)) {                    //ignores "->" and "Category"
518                                                if(!(*iter).compare("\\n")) package.readme += '\n';
519                                                else package.readme += *iter + " ";
520                                        }
521                                }
522                        }
523                }
524
525        }
526        package.doOutput();
527        return package;
528 }
529
530 void recompileAll(vector<string> installedMods)
531 {
532        busy = 1;
533        using namespace boost::gregorian;
534        using namespace boost::posix_time;
535        using boost::lexical_cast;
536        using boost::bad_lexical_cast;
537        
538        setStatusArea("Importing levels...");
539        //setStatusArea("Recompiling Data...");
540        path vanilla_dir = "./packages/VanillaDats/";
541        string importCommand = "";
542        char statusString[128];
543        int numberOfDats = 0;
544        int j = 1;
545        string datString;
546        std::stringstream out;
547
548        ptime start_time(second_clock::local_time());
549        clearOldDats();
550        remove("Install.log");
551        ofstream logfile("Install.log");
552        logfile << "Mod Installation started " << to_simple_string(start_time) << endl;
553        logfile.close();
554        if(splitInstances == SPLIT){
555                recursive_directory_iterator end_iter;
556
557                for ( recursive_directory_iterator dir_itr( vanilla_dir );
558                        dir_itr != end_iter;
559                        ++dir_itr )
560                {
561                        try{
562                                if ( is_directory( dir_itr->status() ) &&  dir_itr.level() == 1)
563                                {
564                                        numberOfDats++;
565                                }
566                        }
567                        catch(exception ex) {
568
569                        }
570                }
571
572                //recursive_directory_iterator end_iter;
573
574
575                out << numberOfDats;
576                datString = out.str();
577                try {
578                        for ( recursive_directory_iterator dir_itr( vanilla_dir );
579                                dir_itr != end_iter;
580                                ++dir_itr )
581                        {
582                                try
583                                {
584                                        if ( is_directory( dir_itr->status() ) &&  dir_itr.level() == 1)
585                                        {
586                                                importCommand = strOniSplit + " " + strImportOption + " " + dir_itr->path().parent_path().string() + '/' + dir_itr->path().filename();
587                                                for (int i = 0; i < installedMods.size(); ++i) {
588                                                        if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().parent_path().filename() + '/' + dir_itr->path().filename()  ))
589                                                                importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().parent_path().filename() + '/' + dir_itr->path().filename();
590
591                                                        //else cout << " packages/VanillaDats/" + installedMods[i] + "/oni/";
592                                                }
593                                                importCommand += " ../GameDataFolder/" + dir_itr->path().filename() + ".dat >> Install.log";
594
595                                                
596                                                setProgressBar( (int)(1000 * (float)(j-1) / (float)numberOfDats) ); //100% * dat we're on / total dats
597                                                setStatusArea("Step " + lexical_cast<std::string>(j) + '/' + lexical_cast<std::string>(numberOfDats)+ ": Importing " +  dir_itr->path().filename() + " ");
598
599                                                system(importCommand.c_str());
600                                                //Sleep(1000);
601                                                //cout << importCommand << "\n";
602                                                j++;
603
604                                        }
605                                }
606                                catch ( const std::exception & ex )
607                                {
608
609                                        remove("Install.log");
610                                        ofstream logfile("Install.log");
611
612
613                                        logfile << "Warning, exception " << ex.what() << "!";
614                                        setStatusArea("Warning, exception " + (string)ex.what() + "!");
615                                        logfile.close();        
616                                }
617                        }
618
619                }
620                catch( const std::exception & ex ) {
621
622                        remove("Install.log");
623                        ofstream logfile("Install.log");
624
625
626                        logfile << "Warning, exception " << ex.what() << "!";
627                        setStatusArea("Warning, exception " + (string)ex.what() + "!");
628                        logfile.close();
629                }
630
631        }
632        else if(splitInstances == NOT_SPLIT){
633                directory_iterator end_iter;
634
635                for ( directory_iterator dir_itr( vanilla_dir );
636                        dir_itr != end_iter;
637                        ++dir_itr )
638                {
639
640                        if ( is_directory( dir_itr->status() ) )
641                        {
642                                numberOfDats++;
643                        }
644
645
646                }
647
648                out << numberOfDats;
649                datString = out.str();
650
651                for ( directory_iterator dir_itr( vanilla_dir );
652                        dir_itr != end_iter;
653                        ++dir_itr )
654                {
655                        try
656                        {
657                                if ( is_directory( dir_itr->status() ) )
658                                {
659                                        importCommand = strOniSplit + " " + strImportOption + " " + vanilla_dir.string() + dir_itr->path().filename() + " ";
660                                        for (int i = 0; i < installedMods.size(); ++i) {
661                                                if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename()  ))
662                                                        importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename();
663                                        }
664                                        importCommand += " ../GameDataFolder/" + dir_itr->path().filename() + ".dat >> Install.log";
665
666
667                                        setProgressBar( (int)(1000 * (float)(j-1) / (float)numberOfDats) ); //100% * dat we're on / total dats
668                                        setStatusArea("Step " + lexical_cast<std::string>(j) + '/' + lexical_cast<std::string>(numberOfDats)+ ": Importing " +  dir_itr->path().filename() + " ");
669
670                                        system(importCommand.c_str());
671
672                                        j++;
673                                }
674                        }
675                        catch ( const std::exception & ex )
676                        {
677
678                                remove("Install.log");
679                                ofstream logfile("Install.log");
680
681
682                                logfile << "Warning, exception " << ex.what() << "!";
683                                setStatusArea("Warning, exception " + (string)ex.what() + "!");
684                                logfile.close();
685                        }}
686        }
687        logfile << "Writing config file";
688        writeInstalledMods(installedMods);
689        setProgressBar(1000);
690        setStatusArea("Done! You can now play Oni.");
691
692        ptime end_time(second_clock::local_time());
693        time_period total_time (start_time, end_time);
694
695
696        ofstream logfile2("Install.log", ios::app | ios::ate);
697        string outstring = (string)"\n\nGlobalization ended " + to_simple_string(end_time) + "\nThe process took ";// + (string)total_time.length();
698
699        logfile2 << "\nGlobalization ended " << to_simple_string(end_time) << "\nThe process took " << total_time.length();
700
701        //logfile2.write(outstring.c_str(), outstring.length());
702        logfile2.close();
703
704        //total_time.length().hours();
705
706        Sleep(1000);
707        setProgressBar(0);
708        busy = 0;
709 }
710
711 void writeInstalledMods(vector<string> installedMods)
712 {
713
714        if ( exists( strInstallCfg ) )
715        {
716                remove( strInstallCfg );
717        }
718
719        ofstream file(strInstallCfg.c_str());
720
721        vector<string>list = installedMods;
722        vector<string>::iterator begin_iter = list.begin();
723        vector<string>::iterator end_iter = list.end();
724
725        sort( list.begin(), list.end() );
726
727        for( ; begin_iter != end_iter; ++begin_iter) {
728                file << *begin_iter << " ";
729        }
730
731        file.close();
732        file.clear();
733
734 }
735
736 vector<string> getInstallString(string Cfg)
737 {
738        //system(strPauseCmd);
739        vector<string> returnval;
740
741        string line;
742        fstream file;
743
744        if (exists( Cfg ))
745        {
746                file.open(Cfg.c_str());
747                getline(file, line);
748                tokenize(line, returnval);
749                file.close();
750                file.clear();
751                sort(returnval.begin(), returnval.end());
752        }
753        else cout << "fail";
754
755        return returnval;
756 }
757
758 //stolen token function...
759 void tokenize(const string& str, vector<string>& tokens, const string& delimiters)
760 {
761        // Skip delimiters at beginning.
762        string::size_type lastPos = str.find_first_not_of(delimiters, 0);
763        // Find first "non-delimiter".
764        string::size_type pos     = str.find_first_of(delimiters, lastPos);
765
766        while (string::npos != pos || string::npos != lastPos)
767        {
768                // Found a token, add it to the vector.
769                tokens.push_back(str.substr(lastPos, pos - lastPos));
770                // Skip delimiters.  Note the "not_of"
771                lastPos = str.find_first_not_of(delimiters, pos);
772                // Find next "non-delimiter"
773                pos = str.find_first_of(delimiters, lastPos);
774        }
775 }
776
777 void clearOldDats(void) {
778        directory_iterator end_iter_gdf;
779        for ( directory_iterator dir_itr_gdf( "../GameDataFolder" );
780                dir_itr_gdf != end_iter_gdf;
781                ++dir_itr_gdf )
782        {
783                //cout << dir_itr_gdf->path().extension() << "\n";
784                if ( dir_itr_gdf->path().extension() == ".dat" || dir_itr_gdf->path().extension() == ".raw" || dir_itr_gdf->path().extension() == ".sep" ) {
785                        remove( dir_itr_gdf->path() );
786                }
787
788        }
789
790 }
791
792 vector<string> globalInstalledMods;
793 vector<ModPackage> globalPackages;
794 #include "boost/thread.hpp"
20   #include <boost/thread/mutex.hpp>
796
797 /////////////////////////////////////////////////////////////////////////////
798 // Name:        main_window.cpp
799 // Purpose:    
800 // Author:      
801 // Modified by:
802 // Created:     07/05/2009 20:38:25
803 // RCS-ID:      
804 // Copyright:  
805 // Licence:    
806 /////////////////////////////////////////////////////////////////////////////
807
21   // For compilers that support precompilation, includes "wx/wx.h".
22   #include "wx/wxprec.h"
23  
# Line 818 | Line 31 | vector<ModPackage> globalPackages;
31  
32   ////@begin includes
33   #include "about.h"
821 ////@end includes
822
34   #include "main_window.h"
35 + #include "installer.h"
36 + ////@end includes
37  
38   ////@begin XPM images
39   #include "aelogosmall.xpm"
# Line 830 | Line 43 | vector<ModPackage> globalPackages;
43   #include "quit.xpm"
44   ////@end XPM images
45  
46 < //#define wxDebug 1;
47 < //#define wxUSE_UNICODE 1;
46 > bool busy = false;
47 > int updateStatus;
48 > bool installerJustUpdated = false;
49 > vector<string> globalInstalledMods;
50 > vector<ModPackage> globalPackages;
51 > // Variable declarations
52 > #ifdef WIN32
53 > bool splitInstances = false;
54 > string strImportOption = "-import:nosep";
55 > string strOniSplit = "Onisplit.exe";
56 > #else
57 > bool splitInstances = false;
58 > string strImportOption = "-import:sep";
59 > string strOniSplit = "mono Onisplit.exe";
60 > #endif
61  
62   /*
63   * MainWindow type definition
# Line 878 | Line 104 | BEGIN_EVENT_TABLE( MainWindow, wxFrame )
104  
105      EVT_MENU( wxID_ABOUT, MainWindow::OnAboutClick )
106  
107 +        EVT_BUTTON( Dir_Button, MainWindow::OnDirButtonClick )
108   ////@end MainWindow event table entries
109  
110   END_EVENT_TABLE()
# Line 888 | Line 115 | END_EVENT_TABLE()
115   */
116  
117   MainWindow::MainWindow()
118 < {
118 > {  
119          Init();
120   }
121  
# Line 915 | Line 142 | bool MainWindow::Create( wxWindow* paren
142          return true;
143   }
144  
918
145   /*
146   * MainWindow destructor
147   */
# Line 926 | Line 152 | MainWindow::~MainWindow()
152          ////@end MainWindow destruction
153   }
154  
929
155   /*
156   * Member initialisation
157   */
# Line 950 | Line 175 | void MainWindow::Init()
175      SeperatedRadio = NULL;
176      CompleteRadio = NULL;
177      ReglobalizeButton = NULL;
953        ////@end MainWindow member initialisation
178  
179 +        ChangeDirectoryButton = NULL;
180 +        ////@end MainWindow member initialisation
181   }
182  
957
183   /*
184   * Control creation for MainWindow
185   */
# Line 991 | Line 216 | void MainWindow::CreateControls()
216      wxMenu* itemMenu42 = new wxMenu;
217      itemMenu42->Append(wxID_OPTIONS, _("Show Advanced Options..."), wxEmptyString, wxITEM_CHECK);
218      menuBar->Append(itemMenu42, _("Options"));
219 <    wxMenu* itemMenu44 = new wxMenu;
220 < #ifdef WIN32
221 <        itemMenu44->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
222 <        menuBar->Append(itemMenu44, _("Help"));
998 < #else
219 > //#ifdef WIN32
220 > //      itemMenu44->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
221 > //      menuBar->Append(itemMenu44, _("Help"));
222 > //#else
223          itemMenu37->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
224 < #endif  
224 > //#endif        
225  
226      itemFrame1->SetMenuBar(menuBar);
227  
# Line 1064 | Line 288 | void MainWindow::CreateControls()
288      StatusArea = new wxStatusBar( itemFrame1, ID_STATUSBAR, 0 );
289      StatusArea->SetName(_T("StatusArea"));
290      StatusArea->SetFieldsCount(1);
291 <    StatusArea->SetStatusText(_("AE Installer v1.0"), 0);
291 >        string versionText = "AE Installer v" + (string)INSTALLER_VERSION;
292 >    StatusArea->SetStatusText(versionText.c_str(), 0);
293      itemBoxSizer2->Add(StatusArea, 0, wxGROW|wxALL, 0);
294  
295      wxBoxSizer* itemBoxSizer20 = new wxBoxSizer(wxHORIZONTAL);
# Line 1127 | Line 352 | void MainWindow::CreateControls()
352      ReglobalizeButton->SetName(_T("Reglobalize_Button"));
353      itemBoxSizer34->Add(ReglobalizeButton, 0, wxGROW|wxALL, 5);
354  
355 <    // Connect events and objects
355 >    wxStaticLine* itemStaticLine100 = new wxStaticLine( OptionsPanel, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
356 >    itemBoxSizer25->Add(itemStaticLine100, 0, wxGROW|wxALL, 5);
357 >
358 >        ChangeDirectoryButton =  new wxButton( OptionsPanel, Dir_Button, _("Change Dir"), wxDefaultPosition, wxDefaultSize, 0 );
359 >        ChangeDirectoryButton->SetName(_T("Dir_Button"));
360 >        itemBoxSizer34->Add(ChangeDirectoryButton, 0, wxGROW|wxALL, 5);
361 >
362 >        // Connect events and objects
363      Mods_CheckboxList->Connect(Mods_CheckboxList1, wxEVT_CREATE, wxWindowCreateEventHandler(MainWindow::ModList_OnCreate), NULL, this);
364          ////@end MainWindow content construction
365 + #ifdef WIN32
366 +        Handle = (HWND)GetHWND();
367 +        ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, (void **)&pTaskbarList);
368 + #endif
369  
370 <        if ( exists( "../../GameDataFolder/level0_Final.sep" ) ) {
1135 <                strImportOption = "-import:sep";
1136 <                splitInstances = NOT_SPLIT;
1137 <        }
1138 <        else {
1139 <                strImportOption = "-import:nosep";
1140 <                splitInstances = SPLIT;
1141 <        }
370 >        updateStatus = GetUpdateStatus(&currentAE, &updateAE, &installerJustUpdated);
371          
372          globalPackages = getPackages();
373          globalInstalledMods = getInstallString();
374 <        for (int i = 0; i < globalPackages.size(); i++) {
374 >        for (unsigned int i = 0; i < globalPackages.size(); i++)
375 >        {
376                  Mods_CheckboxList->Append(globalPackages[i].name.c_str());
377 <                if( binary_search(globalInstalledMods.begin(), globalInstalledMods.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i);
377 >                if (binary_search(globalInstalledMods.begin(), globalInstalledMods.end(), globalPackages[i].modStringName)) Mods_CheckboxList->Check(i);
378          }
379  
380          TheStatusBar = &StatusArea;
# Line 1152 | Line 382 | void MainWindow::CreateControls()
382          TheProgressBar = ProgressBar;
383          OptionsPanel->Hide();
384          
385 < //#ifndef WIN32
1156 < //      itemMenu37->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
1157 <        
1158 < //#endif
1159 <        
1160 <        if(splitInstances == SPLIT) SeperatedRadio->SetValue(true);
385 >        if(splitInstances) SeperatedRadio->SetValue(true);
386          else CompleteRadio->SetValue(true);
387          if(strImportOption == "-import:nosep") NoSepRadio->SetValue(true);
388          else SepRadio->SetValue(true);
389  
1165
390   #ifdef WIN32
391          RedirectIOToConsole();
392          HWND hWnd = GetConsoleWindow();
393          ShowWindow( hWnd, SW_HIDE );
394   #endif
1171
1172        //MainWindow::SetSize(MainWindow::GetRect().GetWidth(), MainWindow::GetRect().GetHeight()-OptionsPanel->GetRect().GetHeight() );
395   }
396  
1175
397   /*
398   * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for SelectAll_Checkbox
399   */
# Line 1181 | Line 402 | void MainWindow::OnSelectAllCheckboxClic
402   {
403          switch(SelectAll->Get3StateValue()) {
404          case wxCHK_UNCHECKED:
405 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
1185 <                //SelectAll->Set3StateValue(wxCHK_CHECKED);
405 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
406                  break;
407          case wxCHK_CHECKED:
408 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, true);
1189 <                //SelectAll->Set3StateValue(wxCHK_UNCHECKED);
408 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, true);
409                  break;
410          case wxCHK_UNDETERMINED:
411 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
1193 <                //SelectAll->Set3StateValue(wxCHK_CHECKED);
411 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
412                  break;
1195
413          }
1197
414   }
415  
1200
416   /*
417   * wxEVT_CREATE event handler for Mods_CheckboxList
418   */
# Line 1205 | Line 420 | void MainWindow::OnSelectAllCheckboxClic
420   void MainWindow::ModList_OnCreate( wxWindowCreateEvent& event )
421   {
422  
1208
423   }
424  
425  
# Line 1257 | Line 471 | wxBitmap MainWindow::GetBitmapResource(
471  
472   wxIcon MainWindow::GetIconResource( const wxString& name )
473   {
1260
474          // Icon retrieval
475          ////@begin MainWindow icon retrieval
476      wxUnusedVar(name);
# Line 1270 | Line 483 | wxIcon MainWindow::GetIconResource( cons
483          ////@end MainWindow icon retrieval
484   }
485  
1273
486   /*
487   * wxEVT_COMMAND_LISTBOX_SELECTED event handler for Mods_CheckboxList1
488   */
489  
490   void MainWindow::OnModsCheckboxList1Selected( wxCommandEvent& event )
491   {
1280        //event.GetSelection
492          titleText->SetValue(globalPackages[event.GetSelection()].name.c_str());
493          creatorText->SetValue(globalPackages[event.GetSelection()].creator.c_str());
494          descriptionText->SetValue(globalPackages[event.GetSelection()].readme.c_str());
1284
1285        //creatorText->Refresh();
495   }
496  
1288
497   /*
498   * wxEVT_COMMAND_CHECKLISTBOX_TOGGLED event handler for Mods_CheckboxList1
499   */
# Line 1319 | Line 527 | void MainWindow::OnOptionsClick( wxComma
527                  
528                  this->SetSize(this->GetRect().GetWidth(), this->GetRect().GetHeight()-OptionsPanel->GetRect().GetHeight());}
529          else {
530 < //              Uncomment this when we release, it gets annoying if you are testing globalization a lot ;)
1323 <                wxMessageDialog* YesNoDialog = new wxMessageDialog(this,                        "WARNING: These options are for advanced users only, use with caution.",
530 >                wxMessageDialog* YesNoDialog = new wxMessageDialog(this, "WARNING: These options are for advanced users only, use with caution.",
531                                                                                                                     "AE Installer Alert",  wxOK | wxICON_EXCLAMATION     , wxDefaultPosition);
532                  YesNoDialog->ShowModal();
533                  OptionsPanel->Show();
# Line 1329 | Line 536 | void MainWindow::OnOptionsClick( wxComma
536          }
537   }
538  
1332
539   /*
540   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_EXIT
541   */
# Line 1339 | Line 545 | void MainWindow::OnExitClick( wxCommandE
545          exit(0);
546   }
547  
1342
548   /*
549   * wxEVT_COMMAND_BUTTON_CLICKED event handler for Install_Button
550   */
551  
1347
552   struct recompile
553   {
554          recompile(vector<string> localPackages) : thePackages(localPackages) { }
# Line 1353 | Line 557 | struct recompile
557                  TheInstallButton->Disable();
558                  recompileAll(thePackages);
559                  TheInstallButton->Enable();
560 +                
561          }
1357
562          vector<string> thePackages;
563   };
564  
565 + void globalize2(void) {
566 +                TheInstallButton->Disable();
567 +                globalizeData();
568 +                TheInstallButton->Enable();
569 + }
570 +
571   void MainWindow::OnInstallButtonClick( wxCommandEvent& event )
572   {
1363
573          vector<string> localPackages;
574 <        localPackages.push_back("Globalize");
575 <        for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) localPackages.push_back( globalPackages[i].modStringName );
574 >        localPackages.push_back("00000Globalize");
575 >        for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) localPackages.push_back( globalPackages[i].modStringName );
576          if ( !localPackages.empty() )   {
577 <        
578 <                //MainWindow::MainWindow().Hide();      
1370 <                //      boost::thread thrd2(recompileAll(localPackages) );
1371 <                //MainWindow::MainWindow().Show();
577 >                sort(localPackages.begin(), localPackages.end());
578 >                localPackages[0] = "Globalize";
579                  this->InstallButton->Disable();
580                  this->ReglobalizeButton->Disable();
581   #ifdef WIN32
# Line 1377 | Line 584 | void MainWindow::OnInstallButtonClick( w
584   #else
585                  recompileAll(localPackages);
586   #endif
1380
587                  this->InstallButton->Enable();
588                  this->ReglobalizeButton->Enable();
589          }
1384
1385
590   }
591  
592 < /*void setStatusArea( string s ) {
593 < //TheStatusBar = MainWindow::StatusArea;
594 < (**TheStatusBar).SetStatusText(_(s.c_str()), 0);
595 <
596 < //MainWindow::MainWindow().SetSize(MainWindow::MainWindow().GetRect().GetWidth(), MainWindow::MainWindow().GetRect().GetHeight()+1);
597 <
598 < //MainWindow::StatusBar->SetLabel("Importing Files...");
599 < //StatusBar->SetLabel(s);
600 < //->SetLabel(s);
601 <
602 < }*/
603 <
1400 < void setProgressBar( int i ) {
1401 <        //TheProgressBar->SetValue(
1402 <
592 > void setProgressBar( int i )
593 > {
594 > #ifdef WIN32
595 > if (SUCCEEDED(pTaskbarList->QueryInterface(IID_ITaskbarList3, (void **)&pTaskbarList3)))
596 > {
597 >        pTaskbarList3->SetProgressValue(Handle,i, 1000);
598 >        if ( i == 0 )
599 >        {
600 >                pTaskbarList3->SetProgressState(Handle,TBPF_NOPROGRESS);
601 >        }
602 > }
603 > #endif
604          TheProgressBar->SetValue(i);
1404
605   }
606  
1407
607   /*
608   * wxEVT_UPDATE_UI event handler for ID_STATUSBAR
609   */
# Line 1417 | Line 616 | void MainWindow::OnStatusbarUpdate( wxUp
616          ////@end wxEVT_UPDATE_UI event handler for ID_STATUSBAR in MainWindow.
617   }
618  
1420
619   /*
620   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT
621   */
# Line 1427 | Line 625 | void MainWindow::OnAboutClick( wxCommand
625          ////@begin wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
626      // Before editing this code, remove the block markers.
627      About* window = new About(this);
628 <    int returnValue = window->ShowModal();
628 >        window->ShowModal();
629      window->Destroy();
630          ////@end wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
631   }
632  
1435
633   /*
634   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for NoSep_RadioButton
635   */
636 <
636 >
637   void MainWindow::OnNoSepRadioButtonSelected( wxCommandEvent& event )
638   {
639          static_cast<string>("-import:nosep");
640   }
641  
1445
642   /*
643   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Sep_RadioButton
644   */
# Line 1452 | Line 648 | void MainWindow::OnSepRadioButtonSelecte
648          static_cast<string>("-import:sep");
649   }
650  
1455
651   /*
652   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
653   */
# Line 1463 | Line 658 | void MainWindow::OnSepRadioButtonSelecte
658  
659   void MainWindow::OnCompleteRadioButtonSelected( wxCommandEvent& event )
660   {
661 <        splitInstances = NOT_SPLIT;
1467 <
661 >        splitInstances = false;
662   }
663  
1470
664   /*
665   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BITMAPBUTTON
666   */
667  
668   void MainWindow::OnRefreshButtonClick( wxCommandEvent& event )
669   {
670 +        globalPackages = getPackages();
671          refreshMods(globalInstalledMods);
672   }
673  
1480
674   /*
675   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_LOAD
676   */
677  
678 <
679 <
1487 <
1488 < void MainWindow::refreshMods (vector<string> s) {
1489 <
678 > void MainWindow::refreshMods (vector<string> s)
679 > {
680          Mods_CheckboxList->Clear();
681 <        //globalInstalledMods = getPackages();
1492 <        for (int i = 0; i < globalPackages.size(); i++) {
681 >        for (unsigned int i = 0; i < globalPackages.size(); i++) {
682                  Mods_CheckboxList->Append(globalPackages[i].name.c_str());
683 <                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i);
684 <                //else Mods_CheckboxList->Check(i,0);
1496 <
683 >                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) )
684 >                        Mods_CheckboxList->Check(i);
685          }
686   }
687  
# Line 1513 | Line 701 | void MainWindow::OnLoadClick( wxCommandE
701          {
702                  refreshMods(getInstallString( string(openFileDialog->GetPath()) ));
703          }
1516
1517
704   }
705  
1520
706   /*
707   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_SAVE
708   */
# Line 1536 | Line 721 | void MainWindow::OnSaveClick( wxCommandE
721  
722          if ( openFileDialog->ShowModal() == wxID_OK )
723          {
1539
1540
1541                //Mods_CheckboxList->
1542
1543
1544
1545                //
1546
724                  if ( exists( openFileDialog->GetPath().c_str() ) )
725                  {
726                          remove( openFileDialog->GetPath().c_str() );
# Line 1552 | Line 729 | void MainWindow::OnSaveClick( wxCommandE
729                  ofstream file(openFileDialog->GetPath().c_str());
730  
731                  vector<string>list;
732 <                for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName );
732 >                for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName );
733                  vector<string>::iterator begin_iter = list.begin();
734                  vector<string>::iterator end_iter = list.end();
735  
# Line 1564 | Line 741 | void MainWindow::OnSaveClick( wxCommandE
741  
742                  file.close();
743                  file.clear();
1567
1568                //SetCurrentFilename(openFileDialog->GetFilename());
1569                //theText->LoadFile(openFileDialog->GetFilename());
1570                //SetStatusText(GetCurrentFilename(), 0);
1571                //SetStatusText(openFileDialog->GetDirectory(),1);
744          }
745   }
746  
1575
1576
747   /*
748   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ReGlobalize_Button
749   */
750  
751   void MainWindow::OnReGlobalizeButtonClick( wxCommandEvent& event )
752   {
753 <        wxMessageDialog* YesNoDialog = new wxMessageDialog(this,                        "WARNING: This will DELETE the Edition's GameDataFolder and recreate it from the vanilla Oni game data. \n Are you SURE you want to do this? ", "AE Installer Alert",  wxYES_NO | wxICON_EXCLAMATION    , wxDefaultPosition);
754 <
755 <        if (YesNoDialog->ShowModal() == wxID_NO) { //if the user said no...
753 >        string YesNoMsg = "WARNING: This will DELETE the Edition's GameDataFolder and recreate it from the vanilla Oni game data.\n";
754 >        YesNoMsg = YesNoMsg + "Are you SURE you want to do this?";
755 >        wxMessageDialog* YesNoDialog = new wxMessageDialog(this, YesNoMsg.c_str(), "AE Installer Alert",  wxYES_NO | wxICON_EXCLAMATION , wxDefaultPosition);
756  
757 +        if (YesNoDialog->ShowModal() == wxID_NO)
758 +        {
759 +                //if the user said no...
760          }
761 <        else {
762 <        
761 >        else
762 >        {
763                  this->InstallButton->Disable();
764                  this->ReglobalizeButton->Disable();
1592
765   #ifdef WIN32
1594
766                  boost::thread thrd2(globalizeData);
767                  //globalizeData();
768                  //boost::thread::create_thread(&globalizeData);
# Line 1600 | Line 771 | void MainWindow::OnReGlobalizeButtonClic
771   #else
772                  globalizeData();
773   #endif
1603                
774                  this->InstallButton->Enable();
775                  this->ReglobalizeButton->Enable();
776          }
1607
777   }
778   /*
779   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
780   */
781  
1613 /*void MainWindow::OnSeparatedRadioButtonSelected( wxCommandEvent& event )
1614 {
1615 ////@begin wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton in MainWindow.
1616 // Before editing this code, remove the block markers.
1617 event.Skip();
1618 ////@end wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton in MainWindow.
1619 }*/
1620
1621
782   /*
783   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Seperated_RadioButton
784   */
785  
786   void MainWindow::OnSeperatedRadioButtonSelected( wxCommandEvent& event )
787   {
788 < splitInstances = SPLIT;
788 >        splitInstances = true;
789   }
790  
791 + void MainWindow::OnDirButtonClick( wxCommandEvent& event )
792 + {
793 +        wxDirDialog* newDir = new wxDirDialog(this, "Set current directory", "", wxDD_DEFAULT_STYLE,
794 +                wxDefaultPosition, wxDefaultSize, "wxDirCtrl");
795 +        newDir->ShowModal();
796 +        if(newDir->GetPath()[0]) current_path( (path)newDir->GetPath() );
797 +        OnRefreshButtonClick(event);
798 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)