Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

geniedialog.cc

Go to the documentation of this file.
00001 /*
00002  * Game Genie Encoder/Decoder
00003  * Copyright (C) 2004-2005 emuWorks
00004  * http://games.technoplaza.net/
00005  *
00006  * This file is part of Game Genie Encoder/Decoder.
00007  *
00008  * Game Genie Encoder/Decoder is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2 of the License, or
00011  * (at your option) any later version.
00012  *
00013  * Game Genie Encoder/Decoder is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  * GNU General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License
00019  * along with Game Genie Encoder/Decoder; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00021  */
00022 
00023 // $Id: geniedialog.cc,v 1.1 2005/07/30 02:28:05 technoplaza Exp $
00024 
00025 #include <QValidator>
00026 
00027 #include "geniedialog.hh"
00028 #include "system.hh"
00029 #include "../tools/decoder.hh"
00030 #include "../tools/encoder.hh"
00031 #include "../model/nesgamegeniecode.hh"
00032 #include "../model/nesrawcode.hh"
00033 #include "../model/snesgamegeniecode.hh"
00034 #include "../model/snesrawcode.hh"
00035 #include "../model/genesisgamegeniecode.hh"
00036 #include "../model/genesisrawcode.hh"
00037 #include "../model/gbgggamegeniecode.hh"
00038 #include "../model/gbggrawcode.hh"
00039 #include "../exceptions/invalidgamegeniecode.hh"
00040 
00041 using namespace emuWorks;
00042 
00043 GenieDialog::GenieDialog() : QDialog(), encoding(false), decoding(false) {
00044     setAttribute(Qt::WA_QuitOnClose);
00045     ui.setupUi(this);
00046     
00047     // setup text box validation
00048     QRegExp regex;
00049     
00050     regex = QRegExp("[A-Fa-f0-9]+");
00051     hexValidator = new QRegExpValidator(regex, this);
00052     
00053     regex = QRegExp("[APZLGITYEOXUKSVNapzlgityeoxuksvn]+");
00054     nesValidator = new QRegExpValidator(regex, this);
00055     
00056     regex = QRegExp("[A-Fa-f0-9-]+");
00057     snesValidator = new QRegExpValidator(regex, this);
00058     
00059     regex = QRegExp("[A-HJ-NPR-TV-Z0-9a-hj-np-tv-z-]+");
00060     genesisValidator = new QRegExpValidator(regex, this);
00061     
00062     regex = QRegExp("[A-Fa-f0-9-]+");
00063     gbggValidator = new QRegExpValidator(regex, this);
00064     
00065     ui.valueEdit->setValidator(hexValidator);
00066     ui.addressEdit->setValidator(hexValidator);
00067     ui.compareEdit->setValidator(hexValidator);
00068     
00069     ui.compareEdit->setMaxLength(2);
00070     
00071     // initialize the system
00072     on_nesRadio_toggled(true);
00073 }
00074 
00075 GenieDialog::~GenieDialog() {
00076     delete hexValidator;
00077     delete nesValidator;
00078     delete snesValidator;
00079     delete genesisValidator;
00080     delete gbggValidator;
00081 }
00082 
00083 void GenieDialog::reset() {
00084     encoding = true;
00085     decoding = true;
00086     
00087     ui.gamegenieEdit->clear();
00088     ui.valueEdit->clear();
00089     ui.addressEdit->clear();
00090     ui.compareEdit->clear();
00091     
00092     encoding = false;
00093     encoding = false;
00094 }
00095 
00096 void GenieDialog::on_nesRadio_toggled(bool checked) {
00097     if (checked) {
00098         reset();
00099         system = NES;
00100         ui.compareEdit->setEnabled(true);
00101         
00102         ui.valueEdit->setMaxLength(2);
00103         ui.addressEdit->setMaxLength(4);
00104         ui.gamegenieEdit->setMaxLength(8);
00105         ui.gamegenieEdit->setValidator(nesValidator);
00106     }
00107 }
00108 
00109 void GenieDialog::on_snesRadio_toggled(bool checked) {
00110     if (checked) {
00111         reset();
00112         system = SNES;
00113         ui.compareEdit->setEnabled(false);
00114         
00115         ui.valueEdit->setMaxLength(2);
00116         ui.addressEdit->setMaxLength(6);
00117         ui.gamegenieEdit->setMaxLength(9);
00118         ui.gamegenieEdit->setValidator(snesValidator);
00119     }
00120 }
00121 
00122 void GenieDialog::on_genesisRadio_toggled(bool checked) {
00123     if (checked) {
00124         reset();
00125         system = GENESIS;
00126         ui.compareEdit->setEnabled(false);
00127         
00128         ui.valueEdit->setMaxLength(4);
00129         ui.addressEdit->setMaxLength(6);
00130         ui.gamegenieEdit->setMaxLength(9);
00131         ui.gamegenieEdit->setValidator(genesisValidator);
00132     }
00133 }
00134 
00135 void GenieDialog::on_gbggRadio_toggled(bool checked) {
00136     if (checked) {
00137         reset();
00138         system = GBGG;
00139         ui.compareEdit->setEnabled(true);
00140         
00141         ui.valueEdit->setMaxLength(2);
00142         ui.addressEdit->setMaxLength(4);
00143         ui.gamegenieEdit->setMaxLength(11);
00144         ui.gamegenieEdit->setValidator(gbggValidator);
00145     }
00146 }
00147 
00148 void GenieDialog::encode() {
00149     if (decoding) {
00150         return;
00151     }
00152     
00153     encoding = true;
00154     
00155     bool ok;
00156     
00157     int value = ui.valueEdit->text().toInt(&ok, 16);
00158     int address = ui.addressEdit->text().toInt(&ok, 16);
00159     int compare = ui.compareEdit->text().toInt(&ok, 16);
00160     
00161     if (system == NES) {
00162         NESRawCode *rawcode;
00163         
00164         if (!ui.compareEdit->text().isEmpty()) {
00165             rawcode = new NESRawCode(address, value, compare);
00166         } else {
00167             rawcode = new NESRawCode(address, value);
00168         }
00169         
00170         NESGameGenieCode ggcode = Encoder::encode(*rawcode);
00171         ui.gamegenieEdit->setText(ggcode.getCode());
00172         
00173         delete rawcode;
00174     } else if (system == SNES) {
00175         SNESRawCode rawcode(address, value);
00176         SNESGameGenieCode ggcode = Encoder::encode(rawcode);
00177         ui.gamegenieEdit->setText(ggcode.getCode());
00178     } else if (system == GENESIS) {
00179         GenesisRawCode rawcode(address, value);
00180         GenesisGameGenieCode ggcode = Encoder::encode(rawcode);
00181         ui.gamegenieEdit->setText(ggcode.getCode());
00182     } else if (system == GBGG) {
00183         GBGGRawCode *rawcode;
00184         
00185         if (!ui.compareEdit->text().isEmpty()) {
00186             rawcode = new GBGGRawCode(address, value, compare);
00187         } else {
00188             rawcode = new GBGGRawCode(address, value);
00189         }
00190         
00191         GBGGGameGenieCode ggcode = Encoder::encode(*rawcode);
00192         ui.gamegenieEdit->setText(ggcode.getCode());
00193         
00194         delete rawcode;
00195     }
00196     
00197     encoding = false;
00198 }
00199 
00200 void GenieDialog::on_valueEdit_textEdited(const QString &) {
00201     encode();
00202 }
00203 
00204 
00205 void GenieDialog::on_addressEdit_textEdited(const QString &) {
00206     encode();
00207 }
00208 
00209 
00210 void GenieDialog::on_compareEdit_textEdited(const QString &) {
00211     encode();
00212 }
00213 
00214 void GenieDialog::decode() {
00215     if (encoding) {
00216         return;
00217     }
00218     
00219     decoding = true;
00220     
00221     QString text = ui.gamegenieEdit->text().toUpper();
00222     
00223     try {
00224         QString str;
00225         
00226         if (system == NES) {
00227             NESGameGenieCode ggcode = NESGameGenieCode::create(text);
00228             NESRawCode rawcode = Decoder::decodeNES(ggcode);
00229             
00230             str.sprintf("%02X", rawcode.getValue());
00231             ui.valueEdit->setText(str);
00232             
00233             str.sprintf("%04X", rawcode.getAddress());
00234             ui.addressEdit->setText(str);
00235             
00236             if (rawcode.hasCompare()) {
00237                 str.sprintf("%02X", rawcode.getCompare());
00238                 ui.compareEdit->setText(str);
00239             } else {
00240                 ui.compareEdit->clear();
00241             }
00242         } else if (system == SNES) {
00243             SNESGameGenieCode ggcode = SNESGameGenieCode::create(text);
00244             SNESRawCode rawcode = Decoder::decodeSNES(ggcode);
00245             
00246             str.sprintf("%02X", rawcode.getValue());
00247             ui.valueEdit->setText(str);
00248             
00249             str.sprintf("%04X", rawcode.getAddress());
00250             ui.addressEdit->setText(str);
00251         } else if (system == GENESIS) {
00252             GenesisGameGenieCode ggcode = GenesisGameGenieCode::create(text);
00253             GenesisRawCode rawcode = Decoder::decodeGenesis(ggcode);
00254             
00255             str.sprintf("%04X", rawcode.getValue());
00256             ui.valueEdit->setText(str);
00257             
00258             str.sprintf("%04X", rawcode.getAddress());
00259             ui.addressEdit->setText(str);
00260         } else if (system == GBGG) {
00261             GBGGGameGenieCode ggcode = GBGGGameGenieCode::create(text);
00262             GBGGRawCode rawcode = Decoder::decodeGBGG(ggcode);
00263             
00264             str.sprintf("%02X", rawcode.getValue());
00265             ui.valueEdit->setText(str);
00266             
00267             str.sprintf("%04X", rawcode.getAddress());
00268             ui.addressEdit->setText(str);
00269             
00270             if (rawcode.hasCompare()) {
00271                 str.sprintf("%02X", rawcode.getCompare());
00272                 ui.compareEdit->setText(str);
00273             } else {
00274                 ui.compareEdit->clear();
00275             }
00276         }
00277     } catch (InvalidGameGenieCodeException e) {
00278         // must not be ready yet...
00279     }
00280     
00281     decoding = false;
00282 }
00283 
00284 void GenieDialog::on_gamegenieEdit_textEdited(const QString &) {
00285     decode();
00286 }
00287 

Generated on Sat Jul 30 15:01:51 2005 for Game Genie Encoder/Decoder by  doxygen 1.4.4