| 1 | /** |
| 2 | * @section LICENSE |
| 3 | * |
| 4 | * PickleLauncher |
| 5 | * Copyright (C) 2010-2011 Scott Smith |
| 6 | * |
| 7 | * This program is free software: you can redistribute it and/or modify |
| 8 | * it under the terms of the GNU General Public License as published by |
| 9 | * the Free Software Foundation, either version 3 of the License, or |
| 10 | * (at your option) any later version. |
| 11 | * |
| 12 | * This program is distributed in the hope that it will be useful, |
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 | * GNU General Public License for more details. |
| 16 | * |
| 17 | * You should have received a copy of the GNU General Public License |
| 18 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 19 | * |
| 20 | * @section LOCATION |
| 21 | */ |
| 22 | |
| 23 | #ifndef CPROFILE_H |
| 24 | #define CPROFILE_H |
| 25 | |
| 26 | #include "cbase.h" |
| 27 | #include "czip.h" |
| 28 | |
| 29 | using namespace std; |
| 30 | |
| 31 | #define ZIP_EXT ".zip" /** The zip extension. */ |
| 32 | |
| 33 | #define PROFILE_TARGETAPP "targetapp=" /** Prefix for the profile file to identify the path the target application. */ |
| 34 | #define PROFILE_FILEPATH "filepath=" /** Prefix for the profile file to identify the initial path for files. */ |
| 35 | #define PROFILE_BLACKLIST "blacklist=" /** Prefix for the profile file to identify items not to be displayed. */ |
| 36 | #define PROFILE_CMDPATH "cmdpath=" /** Prefix for the profile file to identify a command path and binary. */ |
| 37 | #define PROFILE_CMDARG "cmdarg=" /** Prefix for the profile file to identify a command argument. */ |
| 38 | #define PROFILE_EXEPATH "exepath=" /** Prefix for the profile file to identify the executable path. */ |
| 39 | #define PROFILE_EXEFORCE "exeforce=" /** Prefix for the profile file to identify the forced executable path for certain files. */ |
| 40 | #define PROFILE_EXTARG "extarg=" /** Prefix for the profile file to identify the executable path. */ |
| 41 | #define PROFILE_ARGFORCE "argforce=" /** Prefix for the profile file to identify the executable argument force. */ |
| 42 | #define PROFILE_ENTRY_ARGS "entryargs=" /** Prefix for the profile file to identify an entry custom argument values. */ |
| 43 | #define PROFILE_ENTRY_CMDS "entrycmds=" /** Prefix for the profile file to identify an entry custom command values. */ |
| 44 | |
| 45 | #define EXT_DIRS "dirs" /** Special extension identifier for directories. */ |
| 46 | #define VALUE_FILENAME "%filename%" /** Profile keyword that is replaced by the path to selected file. */ |
| 47 | #define VALUE_NOVALUE "%na%" /** Profile keyword that identifies a empty option. */ |
| 48 | #define VALUE_FLAGONLY "%flagonly%" /** Profile keyword that identifies a empty option. */ |
| 49 | |
| 50 | #define MAX_PATH 1024 /** Maximum path length. */ |
| 51 | #define ARG_MIN_COUNT 4 /** Minumum options for an argument. */ |
| 52 | #define ARGFORCE_COUNT 3 /** Minumum options for an argument force. */ |
| 53 | #define EXEFORCE_COUNT 2 /** Minumum options for an exe force. */ |
| 54 | #define TOTAL_LETTERS 27 /** 26 alpha chars plus 1 for anything else */ |
| 55 | |
| 56 | //SEB |
| 57 | #define PROFILE_PLUGIN "plugin" /** Plugin name in profile */ |
| 58 | #define PROFILE_PLUGINTXT "plugintxt" /** Plugin .txt file */ |
| 59 | #define PROFILE_PLUGINNAME "pluginname" /** Plugin clear name */ |
| 60 | |
| 61 | /** @brief Type of items that can be displayed in selection mode |
| 62 | */ |
| 63 | enum ITEMTYPES_T { |
| 64 | TYPE_DIR=0, /** @brief Directory */ |
| 65 | TYPE_FILE, /** @brief File */ |
| 66 | TYPE_ZIP /** @brief Zipfile */ |
| 67 | }; |
| 68 | |
| 69 | /** @brief Data structure for of items that can be displayed in selection mode |
| 70 | */ |
| 71 | struct listitem_t { |
| 72 | listitem_t() : Type(0), Entry(-1), Name("") {}; |
| 73 | uint8_t Type; /** @brief The type of item, file/dir/etc. */ |
| 74 | int16_t Entry; /** @brief The entry index assoicated with this item. */ |
| 75 | string Name; /** @brief The name of the list item. */ |
| 76 | }; |
| 77 | |
| 78 | /** @brief Data structure for of options that can be displayed in selection mode |
| 79 | */ |
| 80 | struct listoption_t { |
| 81 | listoption_t() : Extension(-1), Command(-1), Argument(-1), Name("") {}; |
| 82 | int16_t Extension; /** @brief Index to the extension for the option */ |
| 83 | int16_t Command; /** @brief Index to the command for the option (-1 if not a command) */ |
| 84 | int16_t Argument; /** @brief Index to the argument for the option */ |
| 85 | string Name; /** @brief Display name for the option */ |
| 86 | }; |
| 87 | |
| 88 | /** @brief Data structure for an argument |
| 89 | */ |
| 90 | struct argument_t { |
| 91 | argument_t() : Default(0), Flag(""), Names(), Values() {}; |
| 92 | int8_t Default; /** @brief Index to the default value for the argument */ |
| 93 | string Flag; /** @brief Flag that is used in the command line string which is followed by the value */ |
| 94 | vector<string> Names; /** @brief Names for the possible values */ |
| 95 | vector<string> Values; /** @brief Values for the argument */ |
| 96 | }; |
| 97 | |
| 98 | /** @brief Data structure for overriding argument values that reside in the path |
| 99 | */ |
| 100 | struct argforce_t { |
| 101 | argforce_t() : Argument(0), Path(""), Value("") {}; |
| 102 | uint8_t Argument; /** @brief The index of the agrument to override */ |
| 103 | string Path; /** @brief The location of target files to override */ |
| 104 | string Value; /** @brief Value to overide the argument with */ |
| 105 | }; |
| 106 | |
| 107 | /** @brief Data structure for overriding the exe path for listed files. |
| 108 | */ |
| 109 | struct exeforce_t { |
| 110 | exeforce_t() : exeName(""), exePath(""), Files() {}; |
| 111 | string exeName; /** @brief The executable name to pass the detected files to. */ |
| 112 | string exePath; /** @brief The path to the executable. */ |
| 113 | vector<string> Files; /** @brief Value to overide the argument with */ |
| 114 | }; |
| 115 | |
| 116 | /** @brief Data structure for an command that is run before the application |
| 117 | */ |
| 118 | struct command_t { |
| 119 | command_t() : Name(""), Command(""), Path(""), Arguments() {}; |
| 120 | string Name; /** @brief Display name for the command. */ |
| 121 | string Command; /** @brief Executable name for the command. */ |
| 122 | string Path; /** @brief Path to the executable. */ |
| 123 | vector<argument_t> Arguments; /** @brief Arguments to apply to the command. */ |
| 124 | }; |
| 125 | |
| 126 | /** @brief Data structure for an file extension type |
| 127 | */ |
| 128 | struct extension_t { |
| 129 | extension_t() : exeName(""), exePath(""), extName(), Blacklist(), Arguments(), ArgForces(), ExeForces() {}; |
| 130 | string exeName; /** @brief The executable name to pass the detected files to. */ |
| 131 | string exePath; /** @brief The path to the executable. */ |
| 132 | vector<string> extName; /** @brief The extenion (usually 3 letters). */ |
| 133 | vector<string> Blacklist; /** @brief List of filenames that will be filtered from the selection output. */ |
| 134 | vector<argument_t> Arguments; /** @brief Arguments to apply to the appliction. */ |
| 135 | vector<argforce_t> ArgForces; /** @brief Overide arguments based on path. */ |
| 136 | vector<exeforce_t> ExeForces; /** @brief Overide the exe path based on file names. */ |
| 137 | }; |
| 138 | |
| 139 | /** @brief Data structure for a detected entry that has been set with custom arg/cmd values |
| 140 | */ |
| 141 | struct entry_t { |
| 142 | entry_t() : Custom(false), Name(""), Path(""), Alias(""), CmdValues(), ArgValues() {}; |
| 143 | bool Custom; /** @brief Does the entry have values that are different than the defaults */ |
| 144 | string Name; /** @brief Name of the entry */ |
| 145 | string Path; /** @brief Path to the file */ |
| 146 | string Alias; /** @brief Overides the actual filename for display */ |
| 147 | vector<uint16_t> CmdValues; /** @brief The current selected values for the commands */ |
| 148 | vector<uint16_t> ArgValues; /** @brief The current selected values for the arguments */ |
| 149 | }; |
| 150 | |
| 151 | //SEB |
| 152 | /** @brief Data structure for a plugin that has been set in profile |
| 153 | */ |
| 154 | struct oneplugin_t { |
| 155 | oneplugin_t() : So(""), Name(""), Desc("") {}; |
| 156 | string So; /** @brief So Name of the entry */ |
| 157 | string Name; /** @brief Clear Name to the file */ |
| 158 | string Desc; /** @brief Description of plugin */ |
| 159 | }; |
| 160 | |
| 161 | /** @brief Data structure for a plugin that has been set in profile |
| 162 | */ |
| 163 | struct plugin_t { |
| 164 | plugin_t() : Name(""), TextFile(""), Alias(""), Which(0), Rom(-1), Plugins() {}; |
| 165 | string Name; /** @brief Name of the entry */ |
| 166 | string TextFile; /** @brief Path to the file */ |
| 167 | string Alias; /** @brief Overides the actual filename for display */ |
| 168 | uint16_t Which; /** @brief Current selected plugin */ |
| 169 | int16_t Rom; /** @brief Current plugin for selected Rom */ |
| 170 | vector<oneplugin_t> Plugins; /** @brief The current plugins */ |
| 171 | }; |
| 172 | |
| 173 | /** @brief This class controls loading, processing, and saving of profile data |
| 174 | */ |
| 175 | class CProfile : public CBase |
| 176 | { |
| 177 | public: |
| 178 | /** Constructor. */ |
| 179 | CProfile(); |
| 180 | /** Destructor. */ |
| 181 | virtual ~CProfile(); |
| 182 | |
| 183 | /** @brief Load the profile data from file and store in memory. |
| 184 | * @param location : path to the profile file. |
| 185 | * @param delimiter : the delimiter used between options. |
| 186 | * @return 0 if passed 1 if failed. |
| 187 | */ |
| 188 | int8_t Load ( const string& location, const string& delimiter ); |
| 189 | |
| 190 | /** @brief Save the profile data to file from memory. |
| 191 | * @param location : path to the profile file. |
| 192 | * @param delimiter : the delimiter used between options. |
| 193 | * @return 0 if passed 1 if failed. |
| 194 | */ |
| 195 | int8_t Save ( const string& location, const string& delimiter ); |
| 196 | |
| 197 | /** @brief Load a command from a line from the profile. |
| 198 | * @param fin : file input. |
| 199 | * @param line : current read line. |
| 200 | * @param delimiter : the delimiter used between options. |
| 201 | * @return 0 if passed 1 if failed. |
| 202 | */ |
| 203 | int8_t LoadCmd ( ifstream& fin, string& line, const string& delimiter ); |
| 204 | |
| 205 | /** @brief Load plugins from the profile. |
| 206 | * @return 0 if passed 1 if failed. |
| 207 | */ |
| 208 | int8_t LoadPlugins ( ); |
| 209 | |
| 210 | /** @brief Load a extension from a line from the profile. |
| 211 | * @param fin : file input. |
| 212 | * @param line : current read line. |
| 213 | * @param delimiter : the delimiter used between options. |
| 214 | * @return 0 if passed 1 if failed. |
| 215 | */ |
| 216 | int8_t LoadExt ( ifstream& fin, string& line, const string& delimiter ); |
| 217 | |
| 218 | /** @brief Load a entry from a line from the profile. |
| 219 | * @param fin : file input. |
| 220 | * @param line : current read line. |
| 221 | * @param delimiter : the delimiter used between options. |
| 222 | * @return 0 if passed 1 if failed. |
| 223 | */ |
| 224 | int8_t LoadEntry ( ifstream& fin, string& line, const string& delimiter ); |
| 225 | |
| 226 | /** @brief Scan an entry for command and arguments and load them into a list. |
| 227 | * @param item : the selected item from the list. |
| 228 | * @param items : list to load into. |
| 229 | * @return 0 if passed 1 if failed. |
| 230 | */ |
| 231 | int8_t ScanEntry ( listitem_t& item, vector<listoption_t>& items ); |
| 232 | |
| 233 | /** @brief Add an entry that will contain custom values. |
| 234 | * @param argument : argument with the custom value. |
| 235 | * @param name : name for the new entry. |
| 236 | * @return -1 if failed, else the new size of the entry list. |
| 237 | */ |
| 238 | int16_t AddEntry ( listoption_t& argument, const string& name ); |
| 239 | |
| 240 | /** @brief Scan an entry for values and load them into a list. |
| 241 | * @param item : argument with the custom value. |
| 242 | * @param values : values for the argument. |
| 243 | */ |
| 244 | void ScanArgument ( listoption_t& item, vector<string>& values ); |
| 245 | |
| 246 | /** @brief Scan an the current path for dirs and runable files. |
| 247 | * @param location : path the scan. |
| 248 | * @param showhidden : if true include hidden items in output list, else ignore. |
| 249 | * @param showzip : if true include zip items in output list, else put through filters. |
| 250 | * @param items : entries det. |
| 251 | * @return 0 if passed 1 if failed. |
| 252 | */ |
| 253 | int8_t ScanDir ( string location, bool showhidden, bool showzip, vector<listitem_t>& items ); |
| 254 | |
| 255 | /** @brief Find the extension a file belongs to. |
| 256 | * @param ext : extension to search for. |
| 257 | * @return -1 if failed, else the index of the ext structure. |
| 258 | */ |
| 259 | int16_t FindExtension ( const string& ext ); |
| 260 | |
| 261 | /** @brief Scan def. plugins and load them into a list. |
| 262 | * @param values : values for the argument. |
| 263 | */ |
| 264 | void ScanDefPlugins ( vector<listoption_t>& items ); |
| 265 | |
| 266 | /** @brief Scan rom plugins and load them into a list. |
| 267 | * @param values : values for the argument. |
| 268 | */ |
| 269 | void ScanRomPlugins ( const string& name, vector<listoption_t>& items ); |
| 270 | |
| 271 | /** @brief Scan def. one plugin type and load them into a list. |
| 272 | * @param which : which of the default plugins |
| 273 | * @param values : values for the argument. |
| 274 | */ |
| 275 | void ScanDef1Plugins ( int8_t which, vector<listitem_t>& items ); |
| 276 | |
| 277 | void ScanRom1Plugins ( int8_t which, vector<listitem_t>& items ); |
| 278 | |
| 279 | /** @brief Save 1 type of default plugin |
| 280 | */ |
| 281 | void SaveDef1Plugin ( int8_t which, int8_t index ); |
| 282 | |
| 283 | /** @brief Save plugin for curent Rom |
| 284 | */ |
| 285 | void SaveRom1Plugin ( int8_t which, int8_t index ); |
| 286 | |
| 287 | /** @brief Get CRC of Rom file |
| 288 | */ |
| 289 | string RomCRC (const string& name); |
| 290 | |
| 291 | int8_t FindPlugin(const string& name); |
| 292 | int8_t Find1Plugin(int8_t which, const string& name); |
| 293 | |
| 294 | bool LaunchableDirs; /**< If true directories are considered as launchable, if false browsing is on. */ |
| 295 | string LauncherPath; /**< Path where the launcher was executed from. */ |
| 296 | string LauncherName; /**< Name of the launcher when executed. */ |
| 297 | string FilePath; /**< Current path for searching for runable files. */ |
| 298 | string TargetApp; /**< Label for the target appliction the launcher is executing. */ |
| 299 | string ZipFile; /**< If not empty then the currently loaded zip file. */ |
| 300 | string EntryFilter; |
| 301 | vector<command_t> Commands; /**< Commands to be run before executing the target application. */ |
| 302 | vector<extension_t> Extensions; /**< File extensions runable by the target application. */ |
| 303 | vector<entry_t> Entries; /**< Entries with custom values. */ |
| 304 | vector<int16_t> AlphabeticIndices; /**< Set to cause the current directory to be rescaned. */ |
| 305 | string Rom; /**< CRC of the current rom */ |
| 306 | //SEB |
| 307 | vector<plugin_t> Plugins; /**< All plugins */ |
| 308 | CZip Minizip; /**< Handles examing and extracting zip files. */ |
| 309 | }; |
| 310 | |
| 311 | bool CompareItems( listitem_t a, listitem_t b ); /**< Compare two listitems, which sort by type and then by name. */ |
| 312 | |
| 313 | #endif // CPROFILE_H |