| 1 | < | #pragma once | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 2 | < | /* AE/Mod Installer header file */ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 3 | < | #ifndef DOUBLE_HEADER | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 4 | < | #define DOUBLE_HEADER | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 5 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 6 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 7 | < | #include <string> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 8 | < | #include <vector> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 9 | < | #include <fstream> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 10 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 11 | < | using namespace std; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 12 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 13 | < | static string SLASHSLASH = "//"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 14 | < | static string DIRSLASH = "\\"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 15 | < | string strInstallCfg = "../GameDataFolder/Add.cfg"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 16 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 17 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 18 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 19 | < | #define STRUCT_DEFS | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 20 | < | struct ModPackage | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 21 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 22 | < | bool    isInstalled; //replace with function | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 23 | < | string  name; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 24 | < | string  modStringName; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 25 | < | int     modStringVersion; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 26 | < | bool    hasOnis; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 27 | < | bool    hasDeltas; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 28 | < | bool    hasBSL; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 29 | < | bool    hasDats; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 30 | < | string  category; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 31 | < | string  creator; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 32 | < | bool    isEngine; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 33 | < | string  readme; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 34 | < | bool    globalNeeded; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 35 | < | ModPackage(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 36 | < | void doOutput() | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 37 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 38 | < | cout << "Mod: " << name; cout << "\n"; // remove this when done | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 39 | < | cout << "       String: " << modStringName << " v." << modStringVersion << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 40 | < | cout << "       Category: " << category << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 41 | < | cout << "       Creator: " << creator << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 42 | < | cout << "       HasOnis: " << hasOnis << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 43 | < | cout << "       HasBSL: " << hasBSL << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 44 | < | cout << "       HasDeltas: " << hasDeltas << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 45 | < | cout << "       HasDats: " << hasDats << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 46 | < | cout << "       IsEngine: " << isEngine << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 47 | < | cout << "       GlobalNeeded: " << globalNeeded << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 48 | < | cout << "       Readme: " << readme << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 49 | < | cout << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 50 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 51 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 52 | < | }; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 53 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 54 | < | #define METHOD_DEFS | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 55 | < | // Initialization to default values | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 56 | < | ModPackage::ModPackage() | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 57 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 58 | < | isInstalled = true; // replace with function | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 59 | < | name = ""; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 60 | < | modStringName = ""; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 61 | < | modStringVersion = 0; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 62 | < | hasOnis = false; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 63 | < | hasDeltas = false; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 64 | < | hasBSL = false; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 65 | < | hasDats = false; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 66 | < | category = ""; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 67 | < | creator = ""; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 68 | < | isEngine = false; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 69 | < | readme = ""; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 70 | < | globalNeeded = true; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 71 | < | //              void doOutput() const | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 72 | < | //              { }; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 73 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 74 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 75 | < | #define FUNCTION_PROTOTYPES | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 76 | < | int mainMenu(void); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 77 | < | int globalizeData(void); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 78 | < | int installPackages(void); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 79 | < | int uninstallPackages(void); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 80 | < | int listInstalledPackages(void); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 81 | < | int printInstallerInfo(void); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 82 | < | vector<ModPackage> getPackages(void); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 83 | < | ModPackage fileToModPackage(fstream&); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 84 | < | void recompileAll(vector<string>); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 85 | < | vector<string> getInstallString(string = strInstallCfg); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 86 | < | void tokenize(const string&, vector<string>&, const string& delimiters = " "); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 87 | < | //bool getDirectoryContents(char , char &); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 88 | < | void clearOldDats(void); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 89 | < | void writeInstalledMods( vector<string> ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 90 | < | void setStatusArea( string ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 91 | < | void setProgressBar( int ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 92 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 93 | < | //New copy(path, path) function. Too lazy to implement my own, this is basically how I would have done it though. | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 94 | < | //No, really. :) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 95 | < | //Move to utilities.cpp when the time comes. | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 96 | < | using namespace boost::filesystem; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 97 | < | using namespace std; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 98 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 99 | < | void copy_directory( const path & from_dir_ph, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 100 | < | const path & to_dir_ph ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 101 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 102 | < | void copy( const path & from_file_ph, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 103 | < | const path & to_file_ph ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 104 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 105 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 106 | < | // this function copies files and directories. If copying a | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 107 | < | // directory to a directory, it copies recursively. | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 108 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 109 | < | //pardon the mess, I did this at midnight, and had to fix a bug | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 110 | < | void copy( const path & from_ph, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 111 | < | const path & to_ph ) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 112 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 113 | < | cout << to_ph.string() << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 114 | < | // Make sure that the destination, if it exists, is a directory | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 115 | < | if((exists(to_ph) && !is_directory(to_ph)) || (!exists(from_ph))) cout << "error"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 116 | < | if(!is_directory(from_ph)) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 117 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 118 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 119 | < | if(exists(to_ph)) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 120 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 121 | < | copy_file(from_ph,to_ph/from_ph.filename()); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 122 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 123 | < | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 124 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 125 | < | try{ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 126 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 127 | < | copy_file(from_ph,to_ph); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 128 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 129 | < | catch (exception ex){ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 130 | < | cout << from_ph.string() << " to " << to_ph.string() << "\n"; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 131 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 132 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 133 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 134 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 135 | < | else if(from_ph.filename() != ".svn") | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 136 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 137 | < | path destination; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 138 | < | if(!exists(to_ph)) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 139 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 140 | < | destination=to_ph; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 141 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 142 | < | else | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 143 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 144 | < | destination=to_ph/from_ph.filename(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 145 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 146 | < | //not sure what this did, its going away though. probably error checking ;) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 147 | < | //copy_directory(from_ph,destination); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 148 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 149 | < | for(directory_iterator i(from_ph); i!=directory_iterator(); ++i) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 150 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 151 | < | //the idiot who coded this in the first place (not me) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 152 | < | //forgot to make a new directory. Exception city. x_x | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 153 | < | create_directory(destination); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 154 | < | copy(*i,destination/i->filename()); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 155 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 156 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 157 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 158 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 159 | < | void copy_directory( const path &from_dir_ph, | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 160 | < | const path &to_dir_ph) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 161 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 162 | < | if(!exists(from_dir_ph) || !is_directory(from_dir_ph) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 163 | < | || exists(to_dir_ph)) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 164 | < | cout << !exists(from_dir_ph) << " " << !is_directory(from_dir_ph) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 165 | < | << " " << exists(to_dir_ph); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 166 | < | //boost::throw_exception( filesystem_error( | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 167 | < | //"boost::filesystem::copy_directory", | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 168 | < | //from_dir_ph, to_dir_ph, boost::system::error_code() )); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 169 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 170 | < | # ifdef BOOST_POSIX | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 171 | < | struct stat from_stat; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 172 | < | if ( (::stat( from_dir_ph.string().c_str(), &from_stat ) != 0) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 173 | < | || ::mkdir(to_dir_ph.native_directory_string().c_str(), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 174 | < | from_stat.st_mode)!=0) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 175 | < | # endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 176 | < | //      boost::throw_exception( filesystem_error( | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 177 | < | //      //"boost::filesystem::copy_directory", | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 178 | < | //      from_dir_ph, to_dir_ph, boost::system::error_code())); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 179 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 180 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 181 | < | #endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 182 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 183 | < | #ifdef WIN32 | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 184 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 185 | < | #ifndef __GUICON_H__ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 186 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 187 | < | #define __GUICON_H__ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 188 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 189 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 190 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 191 | < | void RedirectIOToConsole(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 192 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 193 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 194 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 195 | < | #endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 196 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 197 | < | /* End of File */ | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 198 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 199 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 200 | < | #include <windows.h> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 201 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 202 | < | #include <stdio.h> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 203 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 204 | < | #include <fcntl.h> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 205 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 206 | < | #include <io.h> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 207 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 208 | < | #include <iostream> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 209 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 210 | < | #include <fstream> | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 211 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 212 | < | #ifndef _USE_OLD_IOSTREAMS | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 213 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 214 | < | using namespace std; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 215 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 216 | < | #endif | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 217 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 218 | < | // maximum mumber of lines the output console should have | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 219 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 220 | < | static const WORD MAX_CONSOLE_LINES = 500; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 221 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 222 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 223 | < | void RedirectIOToConsole() | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 224 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 225 | < | { | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 226 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 227 | < | int hConHandle; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 228 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 229 | < | long lStdHandle; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 230 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 231 | < | CONSOLE_SCREEN_BUFFER_INFO coninfo; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 232 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 233 | < | FILE *fp; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 234 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 235 | < | // allocate a console for this app | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 236 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 237 | < | AllocConsole(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 238 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 239 | < | // set the screen buffer to be big enough to let us scroll text | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 240 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 241 | < | GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 242 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 243 | < | &coninfo); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 244 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 245 | < | coninfo.dwSize.Y = MAX_CONSOLE_LINES; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 246 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 247 | < | SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 248 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 249 | < | coninfo.dwSize); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 250 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 251 | < | // redirect unbuffered STDOUT to the console | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 252 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 253 | < | lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 254 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 255 | < | hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 256 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 257 | < | fp = _fdopen( hConHandle, "w" ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 258 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 259 | < | *stdout = *fp; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 260 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 261 | < | setvbuf( stdout, NULL, _IONBF, 0 ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 262 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 263 | < | // redirect unbuffered STDIN to the console | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 264 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 265 | < | lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 266 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 267 | < | hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 268 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 269 | < | fp = _fdopen( hConHandle, "r" ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 270 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 271 | < | *stdin = *fp; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 272 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 273 | < | setvbuf( stdin, NULL, _IONBF, 0 ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 274 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 275 | < | // redirect unbuffered STDERR to the console | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 276 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 277 | < | lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 278 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 279 | < | hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 280 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 281 | < | fp = _fdopen( hConHandle, "w" ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 282 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 283 | < | *stderr = *fp; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 284 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 285 | < | setvbuf( stderr, NULL, _IONBF, 0 ); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 286 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 287 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 288 | < | // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 289 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 290 | < | // point to console as well | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 291 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 292 | < | ios::sync_with_stdio(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 293 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 294 | < | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 295 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 296 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 297 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 298 | < | //End of File | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 299 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 300 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 301 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 302 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 303 | < |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 304 | < |  | 
 
 
 
 
 
 
 
 
 | 1 | > | #pragma once | 
 
 
 
 
 | 2 | > | /* AE/Mod Installer header file */ | 
 
 
 
 
 | 3 | > | #ifndef DOUBLE_HEADER | 
 
 
 
 
 | 4 | > | #define DOUBLE_HEADER | 
 
 
 
 
 | 5 | > |  | 
 
 
 
 
 | 6 | > |  | 
 
 
 
 
 | 7 | > | #include <string> | 
 
 
 
 
 | 8 | > | #include <vector> | 
 
 
 
 
 | 9 | > | #include <fstream> | 
 
 
 
 
 | 10 | > |  | 
 
 
 
 
 | 11 | > | using namespace std; | 
 
 
 
 
 | 12 | > |  | 
 
 
 
 
 | 13 | > | static string SLASHSLASH = "//"; | 
 
 
 
 
 | 14 | > | static string DIRSLASH = "\\"; | 
 
 
 
 
 | 15 | > | string strInstallCfg = "../GameDataFolder/Add.cfg"; | 
 
 
 
 
 | 16 | > |  | 
 
 
 
 
 | 17 | > |  | 
 
 
 
 
 | 18 | > |  | 
 
 
 
 
 | 19 | > | #define STRUCT_DEFS | 
 
 
 
 
 | 20 | > | struct ModPackage | 
 
 
 
 
 | 21 | > | { | 
 
 
 
 
 | 22 | > | bool    isInstalled; //replace with function | 
 
 
 
 
 | 23 | > | string  name; | 
 
 
 
 
 | 24 | > | string  modStringName; | 
 
 
 
 
 | 25 | > | int     modStringVersion; | 
 
 
 
 
 | 26 | > | bool    hasOnis; | 
 
 
 
 
 | 27 | > | bool    hasDeltas; | 
 
 
 
 
 | 28 | > | bool    hasBSL; | 
 
 
 
 
 | 29 | > | bool    hasDats; | 
 
 
 
 
 | 30 | > | string  category; | 
 
 
 
 
 | 31 | > | string  creator; | 
 
 
 
 
 | 32 | > | bool    isEngine; | 
 
 
 
 
 | 33 | > | string  readme; | 
 
 
 
 
 | 34 | > | bool    globalNeeded; | 
 
 
 
 
 | 35 | > | ModPackage(); | 
 
 
 
 
 | 36 | > | void doOutput() | 
 
 
 
 
 | 37 | > | { | 
 
 
 
 
 | 38 | > | cout << "Mod: " << name; cout << "\n"; // remove this when done | 
 
 
 
 
 | 39 | > | cout << "       String: " << modStringName << " v." << modStringVersion << "\n"; | 
 
 
 
 
 | 40 | > | cout << "       Category: " << category << "\n"; | 
 
 
 
 
 | 41 | > | cout << "       Creator: " << creator << "\n"; | 
 
 
 
 
 | 42 | > | cout << "       HasOnis: " << hasOnis << "\n"; | 
 
 
 
 
 | 43 | > | cout << "       HasBSL: " << hasBSL << "\n"; | 
 
 
 
 
 | 44 | > | cout << "       HasDeltas: " << hasDeltas << "\n"; | 
 
 
 
 
 | 45 | > | cout << "       HasDats: " << hasDats << "\n"; | 
 
 
 
 
 | 46 | > | cout << "       IsEngine: " << isEngine << "\n"; | 
 
 
 
 
 | 47 | > | cout << "       GlobalNeeded: " << globalNeeded << "\n"; | 
 
 
 
 
 | 48 | > | cout << "       Readme: " << readme << "\n"; | 
 
 
 
 
 | 49 | > | cout << "\n"; | 
 
 
 
 
 | 50 | > | } | 
 
 
 
 
 | 51 | > |  | 
 
 
 
 
 | 52 | > | }; | 
 
 
 
 
 | 53 | > |  | 
 
 
 
 
 | 54 | > | #define METHOD_DEFS | 
 
 
 
 
 | 55 | > | // Initialization to default values | 
 
 
 
 
 | 56 | > | ModPackage::ModPackage() | 
 
 
 
 
 | 57 | > | { | 
 
 
 
 
 | 58 | > | isInstalled = true; // replace with function | 
 
 
 
 
 | 59 | > | name = ""; | 
 
 
 
 
 | 60 | > | modStringName = ""; | 
 
 
 
 
 | 61 | > | modStringVersion = 0; | 
 
 
 
 
 | 62 | > | hasOnis = false; | 
 
 
 
 
 | 63 | > | hasDeltas = false; | 
 
 
 
 
 | 64 | > | hasBSL = false; | 
 
 
 
 
 | 65 | > | hasDats = false; | 
 
 
 
 
 | 66 | > | category = ""; | 
 
 
 
 
 | 67 | > | creator = ""; | 
 
 
 
 
 | 68 | > | isEngine = false; | 
 
 
 
 
 | 69 | > | readme = ""; | 
 
 
 
 
 | 70 | > | globalNeeded = true; | 
 
 
 
 
 | 71 | > | //              void doOutput() const | 
 
 
 
 
 | 72 | > | //              { }; | 
 
 
 
 
 | 73 | > | } | 
 
 
 
 
 | 74 | > |  | 
 
 
 
 
 | 75 | > | #define FUNCTION_PROTOTYPES | 
 
 
 
 
 | 76 | > | int mainMenu(void); | 
 
 
 
 
 | 77 | > | int globalizeData(void); | 
 
 
 
 
 | 78 | > | int installPackages(void); | 
 
 
 
 
 | 79 | > | int uninstallPackages(void); | 
 
 
 
 
 | 80 | > | int listInstalledPackages(void); | 
 
 
 
 
 | 81 | > | int printInstallerInfo(void); | 
 
 
 
 
 | 82 | > | vector<ModPackage> getPackages(void); | 
 
 
 
 
 | 83 | > | ModPackage fileToModPackage(fstream&); | 
 
 
 
 
 | 84 | > | void recompileAll(vector<string>); | 
 
 
 
 
 | 85 | > | vector<string> getInstallString(string = strInstallCfg); | 
 
 
 
 
 | 86 | > | void tokenize(const string&, vector<string>&, const string& delimiters = " "); | 
 
 
 
 
 | 87 | > | //bool getDirectoryContents(char , char &); | 
 
 
 
 
 | 88 | > | void clearOldDats(void); | 
 
 
 
 
 | 89 | > | void writeInstalledMods( vector<string> ); | 
 
 
 
 
 | 90 | > | void setStatusArea( string ); | 
 
 
 
 
 | 91 | > | void setProgressBar( int ); | 
 
 
 
 
 | 92 | > |  | 
 
 
 
 
 | 93 | > | //New copy(path, path) function. Too lazy to implement my own, this is basically how I would have done it though. | 
 
 
 
 
 | 94 | > | //No, really. :) | 
 
 
 
 
 | 95 | > | //Move to utilities.cpp when the time comes. | 
 
 
 
 
 | 96 | > | using namespace boost::filesystem; | 
 
 
 
 
 | 97 | > | using namespace std; | 
 
 
 
 
 | 98 | > |  | 
 
 
 
 
 | 99 | > | void copy_directory( const path & from_dir_ph, | 
 
 
 
 
 | 100 | > | const path & to_dir_ph ); | 
 
 
 
 
 | 101 | > |  | 
 
 
 
 
 | 102 | > | void copy( const path & from_file_ph, | 
 
 
 
 
 | 103 | > | const path & to_file_ph ); | 
 
 
 
 
 | 104 | > |  | 
 
 
 
 
 | 105 | > |  | 
 
 
 
 
 | 106 | > | // this function copies files and directories. If copying a | 
 
 
 
 
 | 107 | > | // directory to a directory, it copies recursively. | 
 
 
 
 
 | 108 | > |  | 
 
 
 
 
 | 109 | > | //pardon the mess, I did this at midnight, and had to fix a bug | 
 
 
 
 
 | 110 | > | void copy( const path & from_ph, | 
 
 
 
 
 | 111 | > | const path & to_ph ) | 
 
 
 
 
 | 112 | > | { | 
 
 
 
 
 | 113 | > | cout << to_ph.string() << "\n"; | 
 
 
 
 
 | 114 | > | // Make sure that the destination, if it exists, is a directory | 
 
 
 
 
 | 115 | > | if((exists(to_ph) && !is_directory(to_ph)) || (!exists(from_ph))) cout << "error"; | 
 
 
 
 
 | 116 | > | if(!is_directory(from_ph)) | 
 
 
 
 
 | 117 | > | { | 
 
 
 
 
 | 118 | > |  | 
 
 
 
 
 | 119 | > | if(exists(to_ph)) | 
 
 
 
 
 | 120 | > | { | 
 
 
 
 
 | 121 | > | copy_file(from_ph,to_ph/from_ph.filename()); | 
 
 
 
 
 | 122 | > | } | 
 
 
 
 
 | 123 | > | else | 
 
 
 
 
 | 124 | > | { | 
 
 
 
 
 | 125 | > | try{ | 
 
 
 
 
 | 126 | > |  | 
 
 
 
 
 | 127 | > | copy_file(from_ph,to_ph); | 
 
 
 
 
 | 128 | > | } | 
 
 
 
 
 | 129 | > | catch (exception ex){ | 
 
 
 
 
 | 130 | > | cout << from_ph.string() << " to " << to_ph.string() << "\n"; | 
 
 
 
 
 | 131 | > | } | 
 
 
 
 
 | 132 | > | } | 
 
 
 
 
 | 133 | > |  | 
 
 
 
 
 | 134 | > | } | 
 
 
 
 
 | 135 | > | else if(from_ph.filename() != ".svn") | 
 
 
 
 
 | 136 | > | { | 
 
 
 
 
 | 137 | > | path destination; | 
 
 
 
 
 | 138 | > | if(!exists(to_ph)) | 
 
 
 
 
 | 139 | > | { | 
 
 
 
 
 | 140 | > | destination=to_ph; | 
 
 
 
 
 | 141 | > | } | 
 
 
 
 
 | 142 | > | else | 
 
 
 
 
 | 143 | > | { | 
 
 
 
 
 | 144 | > | destination=to_ph/from_ph.filename(); | 
 
 
 
 
 | 145 | > | } | 
 
 
 
 
 | 146 | > | //not sure what this did, its going away though. probably error checking ;) | 
 
 
 
 
 | 147 | > | //copy_directory(from_ph,destination); | 
 
 
 
 
 | 148 | > |  | 
 
 
 
 
 | 149 | > | for(directory_iterator i(from_ph); i!=directory_iterator(); ++i) | 
 
 
 
 
 | 150 | > | { | 
 
 
 
 
 | 151 | > | //the idiot who coded this in the first place (not me) | 
 
 
 
 
 | 152 | > | //forgot to make a new directory. Exception city. x_x | 
 
 
 
 
 | 153 | > | create_directory(destination); | 
 
 
 
 
 | 154 | > | copy(*i,destination/i->filename()); | 
 
 
 
 
 | 155 | > | } | 
 
 
 
 
 | 156 | > | } | 
 
 
 
 
 | 157 | > | } | 
 
 
 
 
 | 158 | > |  | 
 
 
 
 
 | 159 | > | void copy_directory( const path &from_dir_ph, | 
 
 
 
 
 | 160 | > | const path &to_dir_ph) | 
 
 
 
 
 | 161 | > | { | 
 
 
 
 
 | 162 | > | if(!exists(from_dir_ph) || !is_directory(from_dir_ph) | 
 
 
 
 
 | 163 | > | || exists(to_dir_ph)) | 
 
 
 
 
 | 164 | > | cout << !exists(from_dir_ph) << " " << !is_directory(from_dir_ph) | 
 
 
 
 
 | 165 | > | << " " << exists(to_dir_ph); | 
 
 
 
 
 | 166 | > | //boost::throw_exception( filesystem_error( | 
 
 
 
 
 | 167 | > | //"boost::filesystem::copy_directory", | 
 
 
 
 
 | 168 | > | //from_dir_ph, to_dir_ph, boost::system::error_code() )); | 
 
 
 
 
 | 169 | > |  | 
 
 
 
 
 | 170 | > | # ifdef BOOST_POSIX | 
 
 
 
 
 | 171 | > | struct stat from_stat; | 
 
 
 
 
 | 172 | > | if ( (::stat( from_dir_ph.string().c_str(), &from_stat ) != 0) | 
 
 
 
 
 | 173 | > | || ::mkdir(to_dir_ph.native_directory_string().c_str(), | 
 
 
 
 
 | 174 | > | from_stat.st_mode)!=0) | 
 
 
 
 
 | 175 | > | # endif | 
 
 
 
 
 | 176 | > | //      boost::throw_exception( filesystem_error( | 
 
 
 
 
 | 177 | > | //      //"boost::filesystem::copy_directory", | 
 
 
 
 
 | 178 | > | //      from_dir_ph, to_dir_ph, boost::system::error_code())); | 
 
 
 
 
 | 179 | > | } | 
 
 
 
 
 | 180 | > |  | 
 
 
 
 
 | 181 | > | #endif | 
 
 
 
 
 | 182 | > |  | 
 
 
 
 
 | 183 | > | #ifdef WIN32 | 
 
 
 
 
 | 184 | > |  | 
 
 
 
 
 | 185 | > | #ifndef __GUICON_H__ | 
 
 
 
 
 | 186 | > |  | 
 
 
 
 
 | 187 | > | #define __GUICON_H__ | 
 
 
 
 
 | 188 | > |  | 
 
 
 
 
 | 189 | > |  | 
 
 
 
 
 | 190 | > |  | 
 
 
 
 
 | 191 | > | void RedirectIOToConsole(); | 
 
 
 
 
 | 192 | > |  | 
 
 
 
 
 | 193 | > |  | 
 
 
 
 
 | 194 | > |  | 
 
 
 
 
 | 195 | > | #endif | 
 
 
 
 
 | 196 | > |  | 
 
 
 
 
 | 197 | > | /* End of File */ | 
 
 
 
 
 | 198 | > |  | 
 
 
 
 
 | 199 | > |  | 
 
 
 
 
 | 200 | > | #include <windows.h> | 
 
 
 
 
 | 201 | > |  | 
 
 
 
 
 | 202 | > | #include <stdio.h> | 
 
 
 
 
 | 203 | > |  | 
 
 
 
 
 | 204 | > | #include <fcntl.h> | 
 
 
 
 
 | 205 | > |  | 
 
 
 
 
 | 206 | > | #include <io.h> | 
 
 
 
 
 | 207 | > |  | 
 
 
 
 
 | 208 | > | #include <iostream> | 
 
 
 
 
 | 209 | > |  | 
 
 
 
 
 | 210 | > | #include <fstream> | 
 
 
 
 
 | 211 | > |  | 
 
 
 
 
 | 212 | > | #ifndef _USE_OLD_IOSTREAMS | 
 
 
 
 
 | 213 | > |  | 
 
 
 
 
 | 214 | > | using namespace std; | 
 
 
 
 
 | 215 | > |  | 
 
 
 
 
 | 216 | > | #endif | 
 
 
 
 
 | 217 | > |  | 
 
 
 
 
 | 218 | > | // maximum mumber of lines the output console should have | 
 
 
 
 
 | 219 | > |  | 
 
 
 
 
 | 220 | > | static const WORD MAX_CONSOLE_LINES = 500; | 
 
 
 
 
 | 221 | > |  | 
 
 
 
 
 | 222 | > |  | 
 
 
 
 
 | 223 | > | void RedirectIOToConsole() | 
 
 
 
 
 | 224 | > |  | 
 
 
 
 
 | 225 | > | { | 
 
 
 
 
 | 226 | > |  | 
 
 
 
 
 | 227 | > | int hConHandle; | 
 
 
 
 
 | 228 | > |  | 
 
 
 
 
 | 229 | > | long lStdHandle; | 
 
 
 
 
 | 230 | > |  | 
 
 
 
 
 | 231 | > | CONSOLE_SCREEN_BUFFER_INFO coninfo; | 
 
 
 
 
 | 232 | > |  | 
 
 
 
 
 | 233 | > | FILE *fp; | 
 
 
 
 
 | 234 | > |  | 
 
 
 
 
 | 235 | > | // allocate a console for this app | 
 
 
 
 
 | 236 | > |  | 
 
 
 
 
 | 237 | > | AllocConsole(); | 
 
 
 
 
 | 238 | > |  | 
 
 
 
 
 | 239 | > | // set the screen buffer to be big enough to let us scroll text | 
 
 
 
 
 | 240 | > |  | 
 
 
 
 
 | 241 | > | GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), | 
 
 
 
 
 | 242 | > |  | 
 
 
 
 
 | 243 | > | &coninfo); | 
 
 
 
 
 | 244 | > |  | 
 
 
 
 
 | 245 | > | coninfo.dwSize.Y = MAX_CONSOLE_LINES; | 
 
 
 
 
 | 246 | > |  | 
 
 
 
 
 | 247 | > | SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), | 
 
 
 
 
 | 248 | > |  | 
 
 
 
 
 | 249 | > | coninfo.dwSize); | 
 
 
 
 
 | 250 | > |  | 
 
 
 
 
 | 251 | > | // redirect unbuffered STDOUT to the console | 
 
 
 
 
 | 252 | > |  | 
 
 
 
 
 | 253 | > | lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); | 
 
 
 
 
 | 254 | > |  | 
 
 
 
 
 | 255 | > | hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); | 
 
 
 
 
 | 256 | > |  | 
 
 
 
 
 | 257 | > | fp = _fdopen( hConHandle, "w" ); | 
 
 
 
 
 | 258 | > |  | 
 
 
 
 
 | 259 | > | *stdout = *fp; | 
 
 
 
 
 | 260 | > |  | 
 
 
 
 
 | 261 | > | setvbuf( stdout, NULL, _IONBF, 0 ); | 
 
 
 
 
 | 262 | > |  | 
 
 
 
 
 | 263 | > | // redirect unbuffered STDIN to the console | 
 
 
 
 
 | 264 | > |  | 
 
 
 
 
 | 265 | > | lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); | 
 
 
 
 
 | 266 | > |  | 
 
 
 
 
 | 267 | > | hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); | 
 
 
 
 
 | 268 | > |  | 
 
 
 
 
 | 269 | > | fp = _fdopen( hConHandle, "r" ); | 
 
 
 
 
 | 270 | > |  | 
 
 
 
 
 | 271 | > | *stdin = *fp; | 
 
 
 
 
 | 272 | > |  | 
 
 
 
 
 | 273 | > | setvbuf( stdin, NULL, _IONBF, 0 ); | 
 
 
 
 
 | 274 | > |  | 
 
 
 
 
 | 275 | > | // redirect unbuffered STDERR to the console | 
 
 
 
 
 | 276 | > |  | 
 
 
 
 
 | 277 | > | lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); | 
 
 
 
 
 | 278 | > |  | 
 
 
 
 
 | 279 | > | hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); | 
 
 
 
 
 | 280 | > |  | 
 
 
 
 
 | 281 | > | fp = _fdopen( hConHandle, "w" ); | 
 
 
 
 
 | 282 | > |  | 
 
 
 
 
 | 283 | > | *stderr = *fp; | 
 
 
 
 
 | 284 | > |  | 
 
 
 
 
 | 285 | > | setvbuf( stderr, NULL, _IONBF, 0 ); | 
 
 
 
 
 | 286 | > |  | 
 
 
 
 
 | 287 | > |  | 
 
 
 
 
 | 288 | > | // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog | 
 
 
 
 
 | 289 | > |  | 
 
 
 
 
 | 290 | > | // point to console as well | 
 
 
 
 
 | 291 | > |  | 
 
 
 
 
 | 292 | > | ios::sync_with_stdio(); | 
 
 
 
 
 | 293 | > |  | 
 
 
 
 
 | 294 | > | } | 
 
 
 
 
 | 295 | > |  | 
 
 
 
 
 | 296 | > |  | 
 
 
 
 
 | 297 | > |  | 
 
 
 
 
 | 298 | > | //End of File | 
 
 
 
 
 | 299 | > |  | 
 
 
 
 
 | 300 | > |  | 
 
 
 
 
 | 301 | > |  | 
 
 
 
 
 | 302 | > |  | 
 
 
 
 
 | 303 | > |  | 
 
 
 
 
 | 304 | > |  | 
 
 
 
 
 
 
 
 
 
 
 | 305 |  | #endif |