geniedialog.cc

Go to the documentation of this file.
00001 /*
00002  * Game Genie Encoder/Decoder
00003  * Copyright (C) 2004-2006,2008 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.6 2008/12/18 03:23:30 jdratlif Exp $
00024 
00025 #include <QValidator>
00026 
00027 #include "exceptions/invalidgamegeniecode.hh"
00028 
00029 #include "model/gbgggamegeniecode.hh"
00030 #include "model/gbggrawcode.hh"
00031 #include "model/genesisgamegeniecode.hh"
00032 #include "model/genesisrawcode.hh"
00033 #include "model/nesgamegeniecode.hh"
00034 #include "model/nesrawcode.hh"
00035 #include "model/snesgamegeniecode.hh"
00036 #include "model/snesrawcode.hh"
00037 
00038 #include "tools/decoder.hh"
00039 #include "tools/encoder.hh"
00040 
00041 #include "view/geniedialog.hh"
00042 #include "view/system.hh"
00043 
00044 using namespace ggencoder;
00045 
00046 GenieDialog::GenieDialog() : QDialog(), encoding(false), decoding(false) {
00047     setAttribute(Qt::WA_QuitOnClose);
00048     ui.setupUi(this);
00049     
00050     // setup text box validation
00051     QRegExp regex;
00052     
00053     regex = QRegExp("[A-Fa-f0-9]+");
00054     hexValidator = new QRegExpValidator(regex, this);
00055     
00056     regex = QRegExp("[APZLGITYEOXUKSVNapzlgityeoxuksvn]+");
00057     nesValidator = new QRegExpValidator(regex, this);
00058     
00059     regex = QRegExp("[A-Fa-f0-9-]+");
00060     snesValidator = new QRegExpValidator(regex, this);
00061     
00062     regex = QRegExp("[A-HJ-NPR-TV-Z0-9a-hj-np-tv-z-]+");
00063     genesisValidator = new QRegExpValidator(regex, this);
00064     
00065     regex = QRegExp("[A-Fa-f0-9-]+");
00066     gbggValidator = new QRegExpValidator(regex, this);
00067     
00068     ui.valueEdit->setValidator(hexValidator);
00069     ui.addressEdit->setValidator(hexValidator);
00070     ui.compareEdit->setValidator(hexValidator);
00071     
00072     ui.compareEdit->setMaxLength(2);
00073     
00074     // initialize the system
00075     on_nesRadio_toggled(true);
00076 }
00077 
00078 GenieDialog::~GenieDialog() {
00079     delete hexValidator;
00080     delete nesValidator;
00081     delete snesValidator;
00082     delete genesisValidator;
00083     delete gbggValidator;
00084 }
00085 
00086 void GenieDialog::decode() {
00087     if (encoding) {
00088         return;
00089     }
00090     
00091     decoding = true;
00092     
00093     QString text = ui.gamegenieEdit->text().toUpper();
00094     
00095     try {
00096         QString str;
00097         
00098         if (system == NES) {
00099             NESGameGenieCode ggcode = NESGameGenieCode::create(text);
00100             NESRawCode rawcode = Decoder::decodeNES(ggcode);
00101             
00102             str.sprintf("%02X", rawcode.getValue());
00103             ui.valueEdit->setText(str);
00104             
00105             str.sprintf("%04X", rawcode.getAddress());
00106             ui.addressEdit->setText(str);
00107             
00108             if (rawcode.hasCompare()) {
00109                 str.sprintf("%02X", rawcode.getCompare());
00110                 ui.compareEdit->setText(str);
00111             } else {
00112                 ui.compareEdit->clear();
00113             }
00114         } else if (system == SNES) {
00115             SNESGameGenieCode ggcode = SNESGameGenieCode::create(text);
00116             SNESRawCode rawcode = Decoder::decodeSNES(ggcode);
00117             
00118             str.sprintf("%02X", rawcode.getValue());
00119             ui.valueEdit->setText(str);
00120             
00121             str.sprintf("%04X", rawcode.getAddress());
00122             ui.addressEdit->setText(str);
00123         } else if (system == GENESIS) {
00124             GenesisGameGenieCode ggcode = GenesisGameGenieCode::create(text);
00125             GenesisRawCode rawcode = Decoder::decodeGenesis(ggcode);
00126             
00127             str.sprintf("%04X", rawcode.getValue());
00128             ui.valueEdit->setText(str);
00129             
00130             str.sprintf("%04X", rawcode.getAddress());
00131             ui.addressEdit->setText(str);
00132         } else if (system == GBGG) {
00133             GBGGGameGenieCode ggcode = GBGGGameGenieCode::create(text);
00134             GBGGRawCode rawcode = Decoder::decodeGBGG(ggcode);
00135             
00136             str.sprintf("%02X", rawcode.getValue());
00137             ui.valueEdit->setText(str);
00138             
00139             str.sprintf("%04X", rawcode.getAddress());
00140             ui.addressEdit->setText(str);
00141             
00142             if (rawcode.hasCompare()) {
00143                 str.sprintf("%02X", rawcode.getCompare());
00144                 ui.compareEdit->setText(str);
00145             } else {
00146                 ui.compareEdit->clear();
00147             }
00148         }
00149     } catch (InvalidGameGenieCodeException e) {
00150         // must not be ready yet...
00151     }
00152     
00153     decoding = false;
00154 }
00155 
00156 void GenieDialog::encode() {
00157     if (decoding) {
00158         return;
00159     }
00160     
00161     encoding = true;
00162     
00163     bool ok;
00164     
00165     int value = ui.valueEdit->text().toInt(&ok, 16);
00166     int address = ui.addressEdit->text().toInt(&ok, 16);
00167     int compare = ui.compareEdit->text().toInt(&ok, 16);
00168     
00169     if (system == NES) {
00170         NESRawCode *rawcode;
00171         
00172         if (!ui.compareEdit->text().isEmpty()) {
00173             rawcode = new NESRawCode(address, value, compare);
00174         } else {
00175             rawcode = new NESRawCode(address, value);
00176         }
00177         
00178         NESGameGenieCode ggcode = Encoder::encode(*rawcode);
00179         ui.gamegenieEdit->setText(ggcode.getCode());
00180         
00181         delete rawcode;
00182     } else if (system == SNES) {
00183         SNESRawCode rawcode(address, value);
00184         SNESGameGenieCode ggcode = Encoder::encode(rawcode);
00185         ui.gamegenieEdit->setText(ggcode.getCode());
00186     } else if (system == GENESIS) {
00187         GenesisRawCode rawcode(address, value);
00188         GenesisGameGenieCode ggcode = Encoder::encode(rawcode);
00189         ui.gamegenieEdit->setText(ggcode.getCode());
00190     } else if (system == GBGG) {
00191         GBGGRawCode *rawcode;
00192         
00193         if (!ui.compareEdit->text().isEmpty()) {
00194             rawcode = new GBGGRawCode(address, value, compare);
00195         } else {
00196             rawcode = new GBGGRawCode(address, value);
00197         }
00198         
00199         GBGGGameGenieCode ggcode = Encoder::encode(*rawcode);
00200         ui.gamegenieEdit->setText(ggcode.getCode());
00201         
00202         delete rawcode;
00203     }
00204     
00205     encoding = false;
00206 }
00207 
00208 void GenieDialog::reset() {
00209     encoding = true;
00210     decoding = true;
00211     
00212     ui.gamegenieEdit->clear();
00213     ui.valueEdit->clear();
00214     ui.addressEdit->clear();
00215     ui.compareEdit->clear();
00216     
00217     encoding = false;
00218     decoding = false;
00219 }
00220 
00221 void GenieDialog::on_addressEdit_textEdited(const QString &) {
00222     encode();
00223 }
00224 
00225 void GenieDialog::on_compareEdit_textEdited(const QString &) {
00226     encode();
00227 }
00228 
00229 void GenieDialog::on_gamegenieEdit_textEdited(const QString &) {
00230     decode();
00231 }
00232 
00233 void GenieDialog::on_gbggRadio_toggled(bool checked) {
00234     if (checked) {
00235         reset();
00236         system = GBGG;
00237         ui.compareEdit->setEnabled(true);
00238         
00239         ui.valueEdit->setMaxLength(2);
00240         ui.addressEdit->setMaxLength(4);
00241         ui.gamegenieEdit->setMaxLength(11);
00242         ui.gamegenieEdit->setValidator(gbggValidator);
00243     }
00244 }
00245 
00246 void GenieDialog::on_genesisRadio_toggled(bool checked) {
00247     if (checked) {
00248         reset();
00249         system = GENESIS;
00250         ui.compareEdit->setEnabled(false);
00251         
00252         ui.valueEdit->setMaxLength(4);
00253         ui.addressEdit->setMaxLength(6);
00254         ui.gamegenieEdit->setMaxLength(9);
00255         ui.gamegenieEdit->setValidator(genesisValidator);
00256     }
00257 }
00258 
00259 void GenieDialog::on_nesRadio_toggled(bool checked) {
00260     if (checked) {
00261         reset();
00262         system = NES;
00263         ui.compareEdit->setEnabled(true);
00264         
00265         ui.valueEdit->setMaxLength(2);
00266         ui.addressEdit->setMaxLength(4);
00267         ui.gamegenieEdit->setMaxLength(8);
00268         ui.gamegenieEdit->setValidator(nesValidator);
00269     }
00270 }
00271 
00272 void GenieDialog::on_snesRadio_toggled(bool checked) {
00273     if (checked) {
00274         reset();
00275         system = SNES;
00276         ui.compareEdit->setEnabled(false);
00277         
00278         ui.valueEdit->setMaxLength(2);
00279         ui.addressEdit->setMaxLength(6);
00280         ui.gamegenieEdit->setMaxLength(9);
00281         ui.gamegenieEdit->setValidator(snesValidator);
00282     }
00283 }
00284 
00285 void GenieDialog::on_valueEdit_textEdited(const QString &) {
00286     encode();
00287 }
00288 

Generated on Thu Dec 18 01:01:24 2008 for Game Genie Encoder/Decoder by  doxygen 1.5.4